Zabbix 2.2 では、SNMPトラップを受信出来るようなので、やってみた。
ZabbixでSNMPトラップを処理する場合は、いくつかあって、
・以前からの方法であるZabbix_Senderを使用する方法
・新しい方法であるアイテムタイプにSNMP trapsを使用する方法
があります。
ただ、新しい方法の資料があまりないので、
以前からの方法をベースに、いろいろと変えて試してみました。
参考
-
ZABBIX SNMPTrap設定
http://extstrg.asabiya.net/pukiwiki/index.php?ZABBIX%20SNMPTrap%C0%DF%C4%EA -
zabbixのsnmptrap受信設定とzabbix_senderの利用
http://amecoro.seesaa.net/article/213247645.html -
Zabbixでsnmptrapdを使い、VMwareのホストから受信
http://seedslight.com/wp/archives/206
変更した点
・1つのサーバにSNMPTrapの結果に集めるのではなく、
SNMPTrapが発行された各サーバに登録するよう変更。
(DNSやHostsでIPアドレスからマシン名を逆引き出来ない環境だと
Trap発生ホスト名が<UNKNOWN>になってしまうことに対する対応を含む)
・複数のOIDがある場合に、うまく動かない点を修正
(とりあえず、6まで対応)
・メッセージを変更
“$hostname $address $community $enterprise $oid”
↓
“$oid:$oid:$oid・・・・・”
ただし、前提条件として、
ホスト登録時に、「ホスト名」でDNS名ではなく、
IPアドレス(SNMPTrapが出るインターフェイスのアドレス)で指定する必要があります。
表示上のホスト名は、「表示名」に設定します。
それでは、設定方法です。
まずは、ZabbixをインストールしているサーバでSNMPTrapd側の設定
vi /etc/snmp/snmptrapd.conf
1 2 3 4 5 6 7 8 9 10 |
# Example configuration file for snmptrapd # # No traps are handled by default, you must edit this file! # # authCommunity log,execute,net public # traphandle SNMPv2-MIB::coldStart /usr/bin/bin/my_great_script cold authCommunity log,execute,net private authCommunity log,execute,net public traphandle default /bin/bash /etc/zabbix/snmptrap.sh |
修正後、snmptrapdサービスの起動と自動起動設定を実施
1 2 |
# service snmptrapd start # chkconfig snmptrapd on |
別のマシンからSNMPTrapを発行して動作確認
(別のWindowsPCで、SNMPトラップ先の設定をして再起動)
ログを確認して、以下のように出ていればOK
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# cat /var/log/messages | grep snmp Dec 7 00:06:09 zabbix2 snmptrapd[8985]: NET-SNMP version 5.5 Dec 7 00:07:27 zabbix2 snmptrapd[8985]: 2013-12-07 00:07:26 192.168.29.40(via UDP: [192.168.29.40]:1151->[192.168.29.153]) TRAP, SNMP v1, community public#012#011SNMPv2-SMI::enterprises.311.1.1.3.1.1 Cold Start Trap (0) Uptime: 0:00:00.00#012 Dec 7 00:07:27 zabbix2 snmptrapd[8985]: 2013-12-07 00:07:27 192.168.29.40(via UDP: [192.168.29.40]:1151->[192.168.29.153]) TRAP, SNMP v1, community public#012#011SNMPv2-SMI::enterprises.311.1.1.3.1.1 Link Up Trap (0) Uptime: 0:00:24.11#012#011IF-MIB::ifIndex.1 = INTEGER: 1 Dec 7 00:07:27 zabbix2 snmptrapd[8985]: 2013-12-07 00:07:27 192.168.29.40(via UDP: [192.168.29.40]:1151->[192.168.29.153]) TRAP, SNMP v1, community public#012#011SNMPv2-SMI::enterprises.311.1.1.3.1.1 Link Up Trap (0) Uptime: 0:00:24.11#012#011IF-MIB::ifIndex.2 = INTEGER: 2 Dec 7 00:07:27 zabbix2 snmptrapd[8985]: 2013-12-07 00:07:27 192.168.29.40(via UDP: [192.168.29.40]:1151->[192.168.29.153]) TRAP, SNMP v1, community public#012#011SNMPv2-SMI::enterprises.311.1.1.3.1.1 Link Up Trap (0) Uptime: 0:00:24.11#012#011IF-MIB::ifIndex.3 = INTEGER: 3 |
次にZabbixサーバ側で、Zabbix_Senderの設定をする。
念のため、SNMP受信用のホストを登録
ホスト名:snmptraps
単体のホストとして登録[IPは127.0.0.1])
まず、テンプレートを作成
テンプレート:Template SNMP Traps
所属グループ:Template
利用中:snmptraps, Template ICOMP Ping
アプリケーション:SNMPTraps
アイテム:SNMPtrapper
タイプ:Zabbixトラッパー
キー:snmptraps
データ型:テキスト
アプリケーション:SNMPTraps
トリガー:SNMPTRAP: {ITEM.VALUE}
条件式:(トラップ受信35秒で自動的に正常。特定のOIDは無視)
{Template SNMP Traps:snmptraps.nodata(35)}=0&{Template SNMP Traps:snmptraps.str(VMWARE-CIMOM-MIB::vmwCimOmHeartbeat)}=0&{Template SNMP Traps:snmptraps.str(VMWARE-VMINFO-MIB::vmwVmHB)}=0
障害イベントを継続して生成:チェックなし
深刻度:情報
これで、Template ICOMP Pingが適用されているすべてのサーバで
SNMPTrap用のZabbixSender受信ができるようになります。
確認
以下のコマンドでzabbix Senderで送信してみて、
snmptrapsホストにて、トリガーが起動し、
35秒後に自動的に状態を元に戻ることを確認する。
(Zabbix サーバのIPは192.168.29.153)
zabbix Senderをまだインストールしていない場合は、
yum -y install zabbix-sender
でインストールする。
1 |
# zabbix_sender -vv -z 192.168.29.153 -p 10051 -s snmptraps -k snmptraps -o "testdata21" |
snmptrapdで設定した、呼び出しスクリプトを作成する。
/etc/zabbix/snmptrap.sh
[root@zabbix2 zabbix]# cat /etc/zabbix/snmptrap.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#!/bin/bash # CONFIGURATION ZABBIX_AGENT_CONF="/etc/zabbix/zabbix_agentd.conf"; ZABBIX_SENDER="/usr/bin/zabbix_sender"; KEY="snmptraps"; HOST="snmptraps"; # Execute read hostname read ip read uptime read oid echo "hostname:$hostname" >> /tmp/snmptrap.log echo "ip:$ip" >> /tmp/snmptrap.log echo "uptime:$uptime" >> /tmp/snmptrap.log echo "oid-org:$oid" >> /tmp/snmptrap.log sendip=`echo $ip | cut -f2 -d'[' | cut -f1 -d']'` echo "sendip:$sendip" >> /tmp/snmptrap.log oidstr=`echo $oid|cut -f2- -d' '` echo "oidstr:$oidstr" >> /tmp/snmptrap.log oidstr=`echo $oidstr |cut -f11 -d'.'` echo "oidstr:$oidstr" >> /tmp/snmptrap.log read address echo "address-org:$address" >> /tmp/snmptrap.log if ! echo $address | cut -f1 -d' ' | grep 'SNMP-COMMUNITY-MIB::snmpTrapAddress'; then oidstr=$oidstr:`echo $address|cut -f2- -d' '` echo "oidstr:$oidstr" >> /tmp/snmptrap.log read address echo "address-org:$address" >> /tmp/snmptrap.log fi if ! echo $address | cut -f1 -d' ' | grep 'SNMP-COMMUNITY-MIB::snmpTrapAddress'; then oidstr=$oidstr:`echo $address|cut -f2- -d' '` echo "oidstr:$oidstr" >> /tmp/snmptrap.log read address echo "address-org:$address" >> /tmp/snmptrap.log fi if ! echo $address | cut -f1 -d' ' | grep 'SNMP-COMMUNITY-MIB::snmpTrapAddress'; then oidstr=$oidstr:`echo $address|cut -f2- -d' '` echo "oidstr:$oidstr" >> /tmp/snmptrap.log read address echo "address-org:$address" >> /tmp/snmptrap.log fi if ! echo $address | cut -f1 -d' ' | grep 'SNMP-COMMUNITY-MIB::snmpTrapAddress'; then oidstr=$oidstr:`echo $address|cut -f2- -d' '` echo "oidstr:$oidstr" >> /tmp/snmptrap.log read address echo "address-org:$address" >> /tmp/snmptrap.log fi if ! echo $address | cut -f1 -d' ' | grep 'SNMP-COMMUNITY-MIB::snmpTrapAddress'; then oidstr=$oidstr:`echo $address|cut -f2- -d' '` echo "oidstr:$oidstr" >> /tmp/snmptrap.log read address echo "address-org:$address" >> /tmp/snmptrap.log fi address=`echo $address|cut -f2 -d' '` echo "address:$address" >> /tmp/snmptrap.log read community read enterprise echo "community:$community" >> /tmp/snmptrap.log echo "enterprise:$enterprise" >> /tmp/snmptrap.log community=`echo $community|cut -f2 -d' '` community=`echo $community|cut -f2 -d'"'` enterprise=`echo $enterprise|cut -f2 -d' '` #str="$hostname $address $community $enterprise $oidstr" str="$oidstr" # Output #$ZABBIX_SENDER -c $ZABBIX_AGENT_CONF -s $HOST -k $KEY -o "$sendip $hostname $str" $ZABBIX_SENDER -c $ZABBIX_AGENT_CONF -s $sendip -k $KEY -o "$str" # Debug echo $hostname/$ip/$uptime/$oidstr/$address/$community/$enterprise >> /tmp/snmptrap.log echo $ZABBIX_SENDER -c /etc/zabbix/zabbix_agentd.conf -s $sendip -k $KEY -o "$str" >> /tmp/snmptrap.log |
これで、再度別のマシンからSNMPTrapを発行して動作確認
(別のWindowsPCで、SNMPトラップ先の設定をして再起動)
うまくいけば、Zabbix上で、
該当ホストにてトリガーが発生するはずです。
(現在の設定では、35秒1ブロックとして受信しているので、トリガーは1つだけで、
・トリガー障害時に最初のSNMPTrapメッセージ
・トリガー正常時に最後のSNMPTrapメッセージ
でそれぞれアクションが発生するようになっています。
トリガの設定で障害イベントを継続して生成:チェックありにすれば、すべてのメッセージでアクションが実行されますが、最後のSNMPメッセージが、障害、正常の2件になってしまいます。)
最初のメッセージ(障害発生時アクション)
1 |
SNMPTRAP: SNMPv2-MIB::coldStart |
最後のメッセージ(正常復帰時アクション)
1 |
SNMPTRAP: IF-MIB::linkUp:3 |
受信したすべてのSNMPTrapメッセージを確認する場合は、
監視データ -> 最新データから、発生ホストを選んで、
SNMPTrapsアイテムの snmptrapper ->snmptrapsの履歴で確認できます。
(トリガー発生直後(30分以内)であれば、
監視データ -> トリガから、
名前の部分のトリガー名(SNMPTRAP: IF-MIB::linkUp:3)のヒストリ
からも確認できます。)
2013/12/08 17:41:01 | IF-MIB::linkUp:3 |
2013/12/08 17:41:00 | IF-MIB::linkUp:2 |
2013/12/08 17:41:00 | IF-MIB::linkUp:1 |
2013/12/08 17:41:00 | SNMPv2-MIB::coldStart |
アクションでメール送信等をする場合に、現状はすべてのメッセージを送信していません。
(棒読みちゃんによる音声通知を行っているため、すべてのメッセージを読み上げると大変なことになるので)
このため、最低限の異常発生の通知となっています。
すべてのメッセージで、アクションを実行するためには、
トリガー設定時に「障害イベントを継続して生成:チェックあり」に変更してください。
あと、SNMP用のMIBの登録は以下のサイトが参考になります。
https://sites.google.com/site/osscatalog/tips/linux/centos-snmptrapd-mib-add
ベンダーが用意したMIBの保存場所を用意します。
1 2 3 |
# mkdir /usr/share/snmp/vendormibs # cd /usr/share/snmp/vendormibs # ls |
snmptrapdの設定を変更
vi /etc/sysconfig/snmptrapd
1 2 3 4 |
# cat /etc/sysconfig/snmptrapd # snmptrapd command line options # OPTIONS="-Lsd -p /var/run/snmptrapd.pid" OPTIONS="-Lsd -p /var/run/snmptrapd.pid -M /usr/share/snmp/mibs:/usr/share/snmp/vendormibs -m all " |
snmptrapdサービスをを再起動します。
1 2 3 4 |
# /etc/init.d/snmptrapd restart snmptrapd を停止中: [ OK ] snmptrapd を起動中: [ OK ] # |
mibは、/usr/share/snmp/vendormibs に保存する。
たとえば、VMwareESXiのMIBの場合、https://my.vmware.com/jp/group/vmware/details?downloadGroup=SNMPMIBS550&productId=353からダウンロー
ドできる。
あとは、ダウンロードしたファイルを解凍して、中のファイルを
/usr/share/snmp/vendormibs にコピーします。
更新後に必要かどうかわからないけど、念のため
/etc/init.d/snmptrapd restart
これで、VMwareが定期的に発行するTrapである以下のメッセージは
以下のように変化します。
SNMPv2-SMI::enterprises.6876.4.90 :”07 DD 0C 07 0F 24 31 00 ”
↓
VMWARE-CIMOM-MIB::vmwCimOmHeartbeat:2013-12-7,15:51:55.0
ただし上記メッセージは、定期的に発行させるので、
トリガ条件で除外しています。
VMWARE-CIMOM-MIB::vmwCimOmHeartbeat
VMWARE-VMINFO-MIB::vmwVmHBで始まるSNMPTrap(Lost,Detect)
1 2 3 4 |
SNMPTRAP: {ITEM.VALUE}の条件式: (トラップ受信35秒で自動的に正常。特定のOIDは無視) {Template SNMP Traps:snmptraps.nodata(35)}=0&{Template SNMP Traps:snmptraps.str(VMWARE-CIMOM-MIB::vmwCimOmHeartbeat)}=0&{Template SNMP Traps:snmptraps.str(VMWARE-VMINFO-MIB::vmwVmHB)}=0 |
新しい方法については、また後日確認したいと思います。
はじめまして、@qryuu と申します。
Zabbix のSNMPTrapperはZabbix2.0からの機能となっております。
確かに資料は少ないですが、
こちらで、まとめておりますので
よろしければご参考にしてください
http://www.slideshare.net/qryuu/zabbix20snm-ptt
コメントありがとうございます。
Zabbixについてのスライド資料については、以前より参考にさせていただいております。
現状、新しい方法では、まずはsnmpttを試す前に、zabbix_trap_receiver.plを使ったやつで試しているのですが、まず’/tmp/zabbix_traps.tmp’が生成されない時点でつまずいています。
スクリプト単体で動かすと、以下のメッセージが出るので、
Undefined subroutine &NetSNMP::TrapReceiver::register called at ./zabbix_trap_receiver.pl line 105.
net-snmp-perlのインストールとモジュールパスの確認、
snmptrapd.confへのdisableAuthorization yesの追加は行っているのですが
なかなかうまくいかない状況で、足踏みしています。
ある程度試したら、SNMPTTを試してみたいと思います。
snmptrapd.confの書き方が悪いだけだった。
直したらうまくいった。