Zabbix 2.2 では、SNMPトラップを受信する方法で、
Zabbix_Sender&シェルスクリプトについては、前回成功したので、
今度は、Zabbix2.0から導入されたアイテムタイプ「SNMPトラップ」を利用した方法にチャレンジ。
アイテムタイプ「SNMPトラップ」を使った方法にも2種類あります。
・Perlスクリプトを利用した方法(SNMPTrapdの出力をそのまま出力)
・SNMPTTを利用した方法(市販NMSのようなメッセージ変換が可能)
今回は、Perlスクリプトに関する方法を試してみます。
なお、連携方法については、以下の公式ドキュメントにあります。
https://www.zabbix.com/documentation/2.2/manual/config/items/itemtypes/snmptrap
まずは、Perlスクリプト実行に必要なライブラリをインストール
(今回不要なものがあるかもしれませんが
次に実施予定のSNMPTTに必要とも思われる物も含んでいます。)
1 2 3 4 5 6 |
# yum install net-snmp net-snmp-utils net-snmp-perl # yum install bzip2 gzip tar unzip make curl lynx wget ftp gpg patch gcc # yum install perl perl-CPAN perl-YAML perl-Module-Build perl-Time-HiRes # cpan install Config::IniFiles bye |
cpanは、最初初期設定が必要ですが、全部デフォルトで大丈夫なようです。
なお、gccの依存関係として、kernel-headersが要求される場合がありますが、Walbrixで用意されているCentOS6.4の場合、yumでkernel-headersをインストールできませんでした。(おそらくKernelが3.0.68になっているため)
このため、kernel-headersの3.0.68を探したのですが、正式なインストール方法がわからず、とりあえず見つけた別のOS用のものをインストールして回避しましたが、たぶん悪手だと思います。
1 |
# rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Vine/Vine-6.0/updates/RPMS/i386/kernel-headers-3.0.68-1vl6.i686.rpm |
インストールが完了したら、Perlライブラリが入っているかを確認します。
以下は実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# find `perl -e 'print "@INC"'` -name '*.pm' -print | egrep "(Text/ParseWords|Getopt/Long|Posix|Config/IniFiles|Time/HiRes|Sys/Hostname|File/Basename|Text/Balanced|Socket|Sys/Syslog|DBI|DBD/mysql|DBD/PgPP|DBD/Pg|DBD/ODBC|Win32/ODBC|threads|Thread|NetSNMP/TrapReceiver)\.pm" /usr/local/share/perl5/Config/IniFiles.pm /usr/lib/perl5/vendor_perl/NetSNMP/TrapReceiver.pm /usr/lib/perl5/threads.pm /usr/lib/perl5/Time/HiRes.pm /usr/lib/perl5/Sys/Syslog.pm /usr/lib/perl5/Sys/Hostname.pm /usr/lib/perl5/vendor_perl/NetSNMP/TrapReceiver.pm /usr/lib/perl5/DBD/mysql.pm /usr/lib/perl5/Socket.pm /usr/lib/perl5/Bundle/DBD/mysql.pm /usr/lib/perl5/Bundle/DBI.pm /usr/lib/perl5/DBI.pm /usr/lib/perl5/IO/Socket.pm /usr/share/perl5/Text/ParseWords.pm /usr/share/perl5/Text/Balanced.pm /usr/share/perl5/Getopt/Long.pm /usr/share/perl5/Thread.pm /usr/share/perl5/File/Basename.pm /usr/share/perl5/Net/IMAP/Simple/PipeSocket.pm |
さて、今回使用する肝心のPerlスクリプトですが、Zabbix2.2のソースコードに含まれています。
zabbix 2.2のソースコードをダウンロード
http://www.zabbix.com/jp/download.php
ダウンロードしたファイルを解凍して、以下のファイルをZabbix Serverにコピーします。
zabbix-2.2.0/misc/snmptrap/zabbix_trap_receiver.pl
↓
/etc/zabbix/zabbix_trap_receiver.pl
解凍したファイルに実行権限を与えます。
1 |
# chmod +x /etc/zabbix/zabbix_trap_receiver.pl |
SNMPTrapdの設定を変更する。
# vi /etc/snmp/snmptrapd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 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 perl do "/etc/zabbix/zabbix_trap_receiver.pl" # traphandle default /bin/bash /etc/zabbix/snmptrap.sh disableAuthorization yes pidfile /var/run/snmptrapd.pid donotlogtraps no logoption f /var/log/snmptrap.log |
設定にdisableAuthorization yesを追加する必要があるのと、
SNMPTrapd内蔵のperlで実行するために、
perl do “/etc/zabbix/zabbix_trap_receiver.pl”
と指定します。(上の行で1行です。最初書式を間違えてはまってしまいました。)
なお、 zabbix_trap_receiver.plは、シェル上で実行してもエラーになりますがこれで正常です。
SNMPTrapdからキックされたperlで実行しないといけないようです。
1 2 |
# ./zabbix_trap_receiver.pl Undefined subroutine &NetSNMP::TrapReceiver::register called at ./zabbix_trap_receiver.pl line 105. |
SNMPTrapdの設定を変更したら、SNMPTrapdサービスを再起動します。
必要であれば、自動起動設定もしておきます。
1 2 |
# service snmptrapd restart # chkconfig snmptrapd on |
別のマシンからSNMPTrapを発行して動作確認します。
(別のWindowsPC[192.168.29.40]で、SNMPトラップ先[192.168.29.153]の設定をして再起動)
ログを確認して、以下のように出ていればOKです。
(デフォルトではPerlスクリプトの出力結果は/tmp/zabbix_traps.tmpに出力されます。)
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 |
# cat /var/log/messages | grep snmp Dec 11 23:19:49 zabbix2 snmptrapd[4151]: 2013-12-11 23:19:49 xp-vmclient [192.168.29.40] (via UDP: [192.168.29.40]:3191->[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 11 23:19:49 zabbix2 snmptrapd[4151]: 2013-12-11 23:19:49 xp-vmclient [192.168.29.40] (via UDP: [192.168.29.40]:3191->[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.29#012#011IF-MIB::ifIndex.1 = INTEGER: 1 Dec 11 23:19:49 zabbix2 snmptrapd[4151]: 2013-12-11 23:19:49 xp-vmclient [192.168.29.40] (via UDP: [192.168.29.40]:3191->[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.29#012#011IF-MIB::ifIndex.2 = INTEGER: 2 Dec 11 23:19:50 zabbix2 snmptrapd[4151]: 2013-12-11 23:19:50 xp-vmclient [192.168.29.40] (via UDP: [192.168.29.40]:3191->[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.29#012#011IF-MIB::ifIndex.3 = INTEGER: 3 # cat /tmp/zabbix_traps.tmp 23:19:49 2013/12/11 ZBXTRAP 192.168.29.40 PDU INFO: notificationtype TRAP version 0 receivedfrom UDP: [192.168.29.40]:3191->[192.168.29.153] errorstatus 0 messageid 0 community public transactionid 1947 errorindex 0 requestid 0 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (0) 0:00:00.00 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: SNMPv2-MIB::coldStart SNMP-COMMUNITY-MIB::snmpTrapAddress.0 type=64 value=IpAddress: 192.168.29.40 SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4 value=STRING: "public" SNMPv2-MIB::snmpTrapEnterprise.0 type=6 value=OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1 23:19:49 2013/12/11 ZBXTRAP 192.168.29.40 PDU INFO: notificationtype TRAP version 0 receivedfrom UDP: [192.168.29.40]:3191->[192.168.29.153] errorstatus 0 messageid 0 community public transactionid 1948 errorindex 0 requestid 0 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (2429) 0:00:24.29 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: IF-MIB::linkUp IF-MIB::ifIndex.1 type=2 value=INTEGER: 1 SNMP-COMMUNITY-MIB::snmpTrapAddress.0 type=64 value=IpAddress: 192.168.29.40 SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4 value=STRING: "public" SNMPv2-MIB::snmpTrapEnterprise.0 type=6 value=OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1 23:19:50 2013/12/11 ZBXTRAP 192.168.29.40 PDU INFO: notificationtype TRAP version 0 receivedfrom UDP: [192.168.29.40]:3191->[192.168.29.153] errorstatus 0 messageid 0 community public transactionid 1949 errorindex 0 requestid 0 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (2429) 0:00:24.29 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: IF-MIB::linkUp IF-MIB::ifIndex.2 type=2 value=INTEGER: 2 SNMP-COMMUNITY-MIB::snmpTrapAddress.0 type=64 value=IpAddress: 192.168.29.40 SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4 value=STRING: "public" SNMPv2-MIB::snmpTrapEnterprise.0 type=6 value=OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1 23:19:50 2013/12/11 ZBXTRAP 192.168.29.40 PDU INFO: notificationtype TRAP version 0 receivedfrom UDP: [192.168.29.40]:3191->[192.168.29.153] errorstatus 0 messageid 0 community public transactionid 1950 errorindex 0 requestid 0 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (2429) 0:00:24.29 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: IF-MIB::linkUp IF-MIB::ifIndex.3 type=2 value=INTEGER: 3 SNMP-COMMUNITY-MIB::snmpTrapAddress.0 type=64 value=IpAddress: 192.168.29.40 SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4 value=STRING: "public" SNMPv2-MIB::snmpTrapEnterprise.0 type=6 value=OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1 |
zabbix_server.confに以下の2行を設定します。
SNMPTrapperFile=/tmp/zabbix_traps.tmp
StartSNMPTrapper=1
vi /etc/zabbix/zabbix_server.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
### Option: SNMPTrapperFile # Temporary file used for passing data from SNMP trap daemon to the server. # Must be the same as in zabbix_trap_receiver.pl or SNMPTT configuration file. # # Mandatory: no # Default: # SNMPTrapperFile=/tmp/zabbix_traps.tmp # SNMPTrapperFile=/var/log/snmptt/snmptt.log SNMPTrapperFile=/tmp/zabbix_traps.tmp ### Option: StartSNMPTrapper # If 1, SNMP trapper process is started. # # Mandatory: no # Range: 0-1 # Default: # StartSNMPTrapper=0 StartSNMPTrapper=1 |
zabbix serverを再起動します。
これで、SNMP Trapperが有効になり、
/tmp/zabbix_traps.tmpファイルを監視するようになります。
1 |
# service zabbix-server restart |
次に、テンプレートを作成
テンプレート:Template SNMP Trap
所属グループ:Template
利用中:Template SNMP Generic
アプリケーション:SNMPTrap
アイテム:SNMPtrap-log
タイプ:SNMPトラップ
キー:snmptrap[“”]
データ型:ログ
ログ時間の形式:hh:mm:ss yyyy/MM/dd
アプリケーション:SNMPTrap
アイテム:SNMPtrap-fallback
タイプ:SNMPトラップ
キー:snmptrap.fallback
データ型:ログ
ログ時間の形式:hh:mm:ss yyyy/MM/dd
アプリケーション:SNMPTrap
アイテムのキー:snmptrap.fallbackについては、
今回の場合アンマッチになることがないと思いますが念のため定義。
トリガー:SNMP Trap Log受信
(トラップ受信で異常/トラップ受信35秒で自動的に正常。特定のOIDは無視)
(アクション実行は35秒以内に発生した最初と最後のメッセージのみ。)
([棒読みちゃん連携のため])
条件式:
{Template SNMP Trap:snmptrap[“”].nodata(35)}=0&{Template SNMP Trap:snmptrap[“”].str(VMWARE-CIMOM-MIB::vmwCimOmHeartbeat)}=0&{Template SNMP Trap:snmptrap[“”].str(VMWARE-VMINFO-MIB::vmwVmHB)}=0
障害イベントを継続して生成:チェックなし
深刻度:情報
障害イベントを継続して生成:チェックありにすると、すべてのSNMPTrapでアクションが実行されます。
これで、Template SNMP Genericが適用されているすべてのサーバで
SNMPトラップ受信ができるようになります。
再度、別のマシンからSNMPTrapを発行して動作確認します。
受信したすべてのSNMPTrapメッセージを確認する場合は、
監視データ -> 最新データから、発生ホストを選んで、
SNMPTrapsアイテムの snmptrapper ->snmptrapsの履歴で確認できます。
(トリガー発生直後(30分以内)であれば、
監視データ -> トリガから、
名前の部分のトリガー名(SNMPTRAP: IF-MIB::linkUp:3)のヒストリ
からも確認できます。)
2013/12/11 23:19:50 | 2013/12/11 23:19:50 | 23:19:50 2013/12/11 PDU INFO: notificationtype TRAP version 0 receivedfrom UDP: [192.168.29.40]:3191->[192.168.29.153] errorstatus 0 messageid 0 community public transactionid 1950 errorindex 0 requestid 0 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (2429) 0:00:24.29 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: IF-MIB::linkUp IF-MIB::ifIndex.3 type=2 value=INTEGER: 3 SNMP-COMMUNITY-MIB::snmpTrapAddress.0 type=64 value=IpAddress: 192.168.29.40 SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4 value=STRING: “public” SNMPv2-MIB::snmpTrapEnterprise.0 type=6 value=OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1 |
2013/12/11 23:19:50 | 2013/12/11 23:19:50 | 23:19:50 2013/12/11 PDU INFO: notificationtype TRAP version 0 receivedfrom UDP: [192.168.29.40]:3191->[192.168.29.153] errorstatus 0 messageid 0 community public transactionid 1949 errorindex 0 requestid 0 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (2429) 0:00:24.29 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: IF-MIB::linkUp IF-MIB::ifIndex.2 type=2 value=INTEGER: 2 SNMP-COMMUNITY-MIB::snmpTrapAddress.0 type=64 value=IpAddress: 192.168.29.40 SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4 value=STRING: “public” SNMPv2-MIB::snmpTrapEnterprise.0 type=6 value=OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1 |
2013/12/11 23:19:50 | 2013/12/11 23:19:49 | 23:19:49 2013/12/11 PDU INFO: notificationtype TRAP version 0 receivedfrom UDP: [192.168.29.40]:3191->[192.168.29.153] errorstatus 0 messageid 0 community public transactionid 1948 errorindex 0 requestid 0 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (2429) 0:00:24.29 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: IF-MIB::linkUp IF-MIB::ifIndex.1 type=2 value=INTEGER: 1 SNMP-COMMUNITY-MIB::snmpTrapAddress.0 type=64 value=IpAddress: 192.168.29.40 SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4 value=STRING: “public” SNMPv2-MIB::snmpTrapEnterprise.0 type=6 value=OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1 |
2013/12/11 23:19:50 | 2013/12/11 23:19:49 | 23:19:49 2013/12/11 PDU INFO: notificationtype TRAP version 0 receivedfrom UDP: [192.168.29.40]:3191->[192.168.29.153] errorstatus 0 messageid 0 community public transactionid 1947 errorindex 0 requestid 0 VARBINDS: DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (0) 0:00:00.00 SNMPv2-MIB::snmpTrapOID.0 type=6 value=OID: SNMPv2-MIB::coldStart SNMP-COMMUNITY-MIB::snmpTrapAddress.0 type=64 value=IpAddress: 192.168.29.40 SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4 value=STRING: “public” SNMPv2-MIB::snmpTrapEnterprise.0 type=6 value=OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1 |
次は、SNMPTrapper & SNMPTT での組み合わせを試してみたいと思います。
今回の参考URL
Zabbix2.2 公式ドキュメント(英語)
https://www.zabbix.com/documentation/2.2/manual/config/items/itemtypes/snmptrap
米麹の検証日記 SNMPTT その1
http://ricemalt.blog98.fc2.com/blog-entry-20.html
ZABBIX-JP Study#5 Zabbix2.0rc1 SNMP Traps
http://www.slideshare.net/HaruyoshiChiyoda/zabbixjp-study4-zabbix20rc1-snmp-traps
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
http://www.slideshare.net/qryuu/zabbix20snm-ptt