震災の影響を受けてか、いわゆるシステム開発の場においても「死活監視」を必要とする要望が増えている。ただ、ここで言っているのは、ジョージ・オーウェル「1984年」のBigBrotherもどきの「他人を監視します」のノリのものでなく「自分がやばけりゃ報告します」のこと。ということで、SNMPTrapに関する備忘。

Linuxなどでnet-snmpを使用する場合、SNMPTrapをあげる方法はsnmptrapコマンドを打つか、snmpdデーモンに送らせるかの二通りがあるようだ。前者のsnmptrapを使ったやり方の情報はWebにも多いが、後者のsnmpd発の方法は以外と少ない。かろうじて見つけた方法も課題があった。以下に述べる。

/usr/share/snmp/snmpd.conf
:
trapcommunity localcom
trapcommunity securecom
trap2sink localhost localcom
trap2sink 192.168.1.5 securecom
createUser _internal MD5 "the first sign of madness"
iquerySecName _internal
rouser _internal
monitor -u _internal -r 30 "procTable" prErrorFlag != 0


確かに上の設定でsnmpdからSNMPTrapがあがるが、その内容はprErrorFlagのOID(1.3.6.1.4.1.2021.2.1.100.インデックス番号)のみであった。今回やりたかったことは、prErroFlagでなく、エラーが発生したプロセス名(prNames)、エラーメッセージ(prErrMessage)のOIDとさらにその内容もSNMPTrapであげたかった。そのためにはmonitorの行を以下のように設定すればよい。

/usr/share/snmp/snmpd.conf(変更後)
:
trapcommunity localcom
trapcommunity securecom
trap2sink localhost localcom
trap2sink 192.168.1.5 securecom
createUser _internal MD5 "the first sign of madness"
iquerySecName _internal
rouser _internal
monitor -u _internal -r 30 -o prNames -o prErrMessage "procTable" prErrorFlag != 0


要は-oの後にOIDを指定すれば、その値もTrapに含めて返すようだ。これは結構ハマった。

http://www.net-snmp.org/docs/man/snmpd.examples.html