Zabbix 2.2 のSNMPトラップ受信でいろいろやってみる。 その2(SNMPTrapper&perlスクリプト)


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に必要とも思われる物も含んでいます。)

# 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用のものをインストールして回避しましたが、たぶん悪手だと思います。

# 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ライブラリが入っているかを確認します。
以下は実行例

# 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

解凍したファイルに実行権限を与えます。

# chmod +x /etc/zabbix/zabbix_trap_receiver.pl

 

SNMPTrapdの設定を変更する。

# vi /etc/snmp/snmptrapd.conf

# 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で実行しないといけないようです。

# ./zabbix_trap_receiver.pl
Undefined subroutine &NetSNMP::TrapReceiver::register called at ./zabbix_trap_receiver.pl line 105.

 

SNMPTrapdの設定を変更したら、SNMPTrapdサービスを再起動します。
必要であれば、自動起動設定もしておきます。

# service snmptrapd restart
# chkconfig snmptrapd on

 

別のマシンからSNMPTrapを発行して動作確認します。
(別のWindowsPC[192.168.29.40]で、SNMPトラップ先[192.168.29.153]の設定をして再起動)
ログを確認して、以下のように出ていればOKです。
(デフォルトではPerlスクリプトの出力結果は/tmp/zabbix_traps.tmpに出力されます。)

# 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サーバ側での設定をします。

 zabbix_server.confに以下の2行を設定します。

SNMPTrapperFile=/tmp/zabbix_traps.tmp
StartSNMPTrapper=1

vi /etc/zabbix/zabbix_server.conf

### 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ファイルを監視するようになります。

# 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

 

Views: 44

カテゴリー: Walbrix, Zabbix パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です