ZABBIXとvCenter(日本語)のSNMP連携について
そういえば誰かこんなのも困ってるかもと思って記事を書いてみる。
ZABBIXでSNMPを受信してvCenterのイベントを監視しよう!とか考えた時、実はvCenterが16進数でよくわからないものを送ってきたりする。これは実はvCenterが日本語版であるのが原因。英語に直せばいいんですが、もう安定稼働しちゃってるし読みづらいし嫌!っていうときの対応方針です。
ZABBIXのSNMPトラップはまんまsnmptrapdを利用するケースが多いと思うので、それを準拠に書きます。
まず、日本語を16進数にされたメッセージはLinuxの「xxd -r -p 」コマンドで日本語に戻すことが可能です。
なので、snmptrapdで受信したメッセージにこれをかけるだけで大丈夫。多分。
とりあえず、標準入力に文字を入力すると変換してくれるような、以下のような感じのスクリプトを書きます。
parse_hex.pl
#!/usr/bin/perl while(chomp($input = <STDIN>)){ #$input =~ s/\\n/ /g; $input =~ s/\"([nA-F0-9\s\\]+?)\"/ '"' . `echo -n -e $1 | xxd -r -p` . '"' /eg; print $input; }
(あれ文字コードってどっかで指定しないとダメかな…全部UTF-8な環境なら動いてるけど)
で、これをsnmptrapdが拾ったあとにZABBIXに送信するためのsnmptrap.shにて利用します。
snmptrap.sh
# CONFIGURATION ZABBIX_SERVER="localhost"; ZABBIX_PORT="10051"; ZABBIX_SENDER="/usr/bin/zabbix_sender"; HEX_FILTER="/etc/zabbix/parse_hex.pl" KEY="snmptraps"; HOST="snmptraps"; # END OF CONFIGURATION str="" while read line; do str="$str\n$line" done str=`echo $str | $HEX_FILTER` str=`echo -e $str` $ZABBIX_SENDER -c /etc/zabbix/zabbix_agentd.conf -s "$HOST" -k $KEY -o "$str"
なお、これ欠陥あります。
全部の型の全部のパラメータ、しかもOIDストリング自体までこのフィルタかけてるので駄目なんです。中途半端に16進数っぽい文字列があると途端に不具合起こします。
どうやってパラメータ部のみにこれ適用するかは未検討だったりします…。とにかく日本語トラップが来ることを想定した場合はいい感じにxxdコマンドを使いましょうということで一つ。
あ、よくトラップを判読させるのにsnmpttなど用いますが、何というか見知らぬSNMPトラップが来たときに対応できそうにないので使っていません。ちゃんと全トラップの、パラメータの順番などを全て把握していないとうまく使えないっぽいので、そこまでするならSNMPトラップの全文読むわーって思う。そういうところを考えると、機種に正式対応したエンタープライズ向けSNMP管理できるソフトウェアっていいよねって思う。そこがZABBIXやりづらい。