がらくたネット


SNMPTT

SNMPTT

http://snmptt.sourceforge.net/

SNMPTT (SNMP Trap Translator)

MIBファイルのTRAP-TYPE (SMIv1)かNOTIFICATION-TYPE (SMIv2)部分を利用する

SNMPTTとnagiosを連携させることが可能

動き:対象機器からTrapをsnmptrapdが受け取りtraphandleを利用してSNMPTTの snmptthandlerに渡す。snmptthandlerはTrapを/var/spool/snmpttにファイルとして保存する

SNMPTT DaemonはDefaultで5秒毎に/var/spool/snmpttを確認しファイルが存在していれば 中身を読み込む。

OIDを元にTrapFilesに記載されたファイル内で該当セクションを探し 存在していればEXEC行に記載されたnagiosのsubmit_check_resultを実行する。

その結果をnagiosが受け、定義に従い通知などの処理を行う。

v1.3(beta2)

2009/07/25にv1.3 beta2がリリース

システム要件

  • 必須
    • Perl 5.6以上
    • Net-SNMP
    • Text::ParseWords
    • Getopt::Long
    • Posix
    • Config::IniFiles
    • Time::HiRes
    • Sys::Hostname
    • File::Basename
    • Text::Balanced
  • オプショナル
    • Socket
    • Sys::Syslog
    • DBI
    • DBD::mysql
    • DBD::PgPP or DBD:Pg
    • DBD::ODBC
    • Win32::ODBC
    • Net-SNMP Perl 5.1.1以上
    • threads
    • Thread

動作モードは2種類ある

  • Standalone Mode
    • snmptrapd.confへの設定
      traphandle default /usr/sbin/snmptt
  • 動き
  1. snmptrapdからTRAP情報を読み取り
  2. snmptt.iniから.confファイルを読み取ってTRAP定義を確認
  3. 適合するTRAPを検索
  4. ログに記録してEXEC行を実行
  5. 完了
  • Daemon Mode
    • snmptrapd.confへの設定
      traphandle default /usr/sbin/snmptthandler
  • snmptthandlerの動き
  1. snmptrapdからTRAP情報を読み取り
  2. /var/spool/snmpttのspoolディレクトリに新しくファイルを作成してTRAP情報を記録
  3. 完了
  • snmptt daemonの動き
  1. snmptt.iniから.confファイルを読み取ってTRAP定義を確認(起動時のみ)
  2. spoolディレクトリからTRAP情報を読み取り
  3. 適合するTRAPを検索
  4. ログに記録してEXEC行を実行
  5. (デフォルトでは)5秒待つ
  6. 2項に戻り実施

Standaloneモードでの設定

# cd /usr/local/src; mkdir snmptt; cd snmptt
# wget http://downloads.sourceforge.net/project/snmptt/snmptt/snmptt_1.3beta2/snmptt_1.3beta2.tgz?use_mirror=ncu
# tar zxvf snmptt_1.3beta2.tgz
# cd snmptt_1.3beta2

cp snmptt /usr/sbin
cp snmptthandler /usr/sbin
cp snmpttconvert* /usr/sbin
chmod +x /usr/sbin/snmptt*
cp snmptt.ini /etc/snmp
cp snmptt.logrotate /etc/logrotate.d/snmptt


ログファイル保存先作成
# mkdir /var/log/snmptt

# vi /etc/snmp/snmptrapd.conf
traphandle default /usr/sbin/snmptt

snmptrapd -Onで起動
 -OnはsnmptrapdがOIDをsnmpttに通過させるオプション

snmptrapd.confでセキュリティ設定し忘れに注意!

authCommunity log,execute,net <community strings>

snmptt.iniの修正

  • 詳細設定はiniファイル内にコメントが記載されているので参照する
  • 最終行のsnmptt_conf_filesにsnmpttのconfファイルを指定する

snmptt.confの作成

  • ここが一番のポイント
  • ファイル名は何でもよい
  • snmp.iniに追加しなければ有効にならない
  • MIBファイルからsnmpttconvertmibを利用してsnmptt用に生成する

snmptt.confの作成

snmpttはMIBファイルからsnmptt.confファイルを作成しなければいけなく、このファイルがポイントとなる

MIBファイルから作成するツールが付属

環境
対象MIBファイル /usr/share/snmp/mibs/IF-MIB.txt
snmptt.conf保存ディレクトリ /etc/snmp/snmptt
snmptt.ini /etc/snmp/snmptt.ini
submit_check_result /usr/local/nagios/libexec/submit_check_result

コンバート

# cd /etc/snmp/snmptt
# snmpttconvertmib --exec='/usr/local/nagios/libexec/submit_check_result SNMPTRAPS "SNMP_TRAPS" 2'--in /usr/share/snmp/mibs/IF-MIB.txt --out IF-MIB.conf
...
Done

Total translations:        2
Successful translations:   2
Failed translations:       0

作成したconfファイルを開くとEVENT、FORMAT、EXEC、SDESC~EDESCが見て取れる
SDESCからEDESCまでは注釈となる
EVENT行がOID等を指定している箇所

FORMAT行に指定した文字列と変数はロギングプロセスに渡され、ログに記載される。

EXEC行の変数はFORMAT行と同様の設定が可能とのことだが、改行などは反映されなかった

同種のMIBファイルが複数ある場合は以下でやると吉

例えばHP(compaq)系のMIBファイルが複数存在している場合
for i in CPQ*
> do
> /usr/local/sbin/snmpttconvertmib --in=$i --out=snmptt.conf.compaq --exec='/usr/local/nagios/libexec/submit_check_result SNMPTRAPS "SNMP_TRAPS" 2'
> done

EXEC /usr/local/nagios/libexec/submit_check_result "$r" "SNMP_TRAPS" <status> "TRAP Message Strings"

第一引数 $r nagiosに渡る際、ホスト名として渡される
第二引数 文字列 nagiosのservice定義名となる
第三引数 nagiosに渡すステータス、0:OK、1:Warnig、2:Critical、-1:Unknown
第四引数 文字列 nagiosのserviceに渡る文字列、$1/$2などのTRAP引数を設定できる、TRAP引数はSDESC~EDESC内にVariablesとして記載があるので参考にする

v1.2

ダウンロード

展開

コピー

 # tar zxvf snmptt_1.2.tgz
 # cd snmptt_1.2
 # cp -p snmptt /usr/sbin
 # cp -p snmptthandler /usr/sbin
 # cp -p snmpttconvert* /usr/sbin
 # cp -p snmptt.ini /etc/snmp
 # vi /etc/snmp/snmptrapd.conf
  traphandle default /usr/sbin/snmptthandler ←全てのtrapをsnmpttに渡す
 # cp -p snmptt-init.d /etc/rc.d/init.d/snmptt
 # chmod +x /etc/rc.d/init.d/snmptt
 # mkdir /var/spool/snmptt
 # chkconfig --add snmptt
 # chkconfig --level 2345 snmptt on
 # service snmptt start

PerlのIniFiles.pmが見つからない場合あり。
起動に失敗する。
この時はPerlのInitFilesをインストールすればOK
cpan2rpmをインストールしてあれば
cpan2rpm --install Config::IniFiles

Time::HiResもいるみたい
その前にnet-snmp-perlもね。

snmptrapdのdaemonオプションに-Onを追加する

snmpttが利用するMIBファイルを生成する

ベンダー分も生成しておくとよい

 # mkdir /etc/snmp/snmptt
 # cd /etc/snmp/snmptt
 # snmpttconvertmib --in /usr/share/snmp/mibs/IF-MIB.txt --out snmptt.conf.IF-MIB
 # snmpttconvertmib --in /usr/share/snmp/mibs/SNMPv2-MIB.txt --out snmptt.conf.SNMPv2-MIB

生成したファイルを編集する

EVENT行とFORMAT、SDESCからEDESCが見て取れるはず
SDESCからEDESCは注釈文となる
FORMAT行の後ろにEXEC行を追加する
EXEC /usr/local/nagios/libexec/eventhandlers/submit_check_result "$r" "SNMP Traps" 1 "Interface $1 on $r is Up"

$rはホスト名かIPアドレスに変換される
submit_check_resultの引数は4つでnagiosで定義されているhost name、Service Description
Statusと任意の文字列となる。
Statusは
0:OK
1:Warrning
2:Critical
3:Unknown
となる。
任意の文字列部分はFORMATやSDESCを読み取り適宜修正する
$1や$2などの変数が利用可能

snmptt.iniに生成したファイルを設定する

 # vi /etc/snmp/snmptt.ini
  daemon_uid = root
  [TrapFiles]
  snmptt_conf_files = <<END
  /etc/snmp/snmptt/snmptt.conf.IF-MIB
  /etc/snmp/snmptt/snmptt.conf.SNMPv2-MIB
  ENC

以下書き直す予定 nagiosのsubmit_check_resultを含むeventhandlerをコピー <code> # cp -pR /usr/local/src/nagios-3.0.2/contrib/eventhandlers /usr/local/nagios/libexec </code> nagiosでSNMP Trapsのサービスを定義する snmpttのdebugを見るには snmptt.iniでdaemon_fork=0を指定してから /usr/sbin/snmptt –daemon debug=2 として実行させる Defaultでは5秒毎にspoolディレクトリを確認する様子が見て取れる snmptrapを受信するとsnmptrapdがtraphandleを利用してspoolディレクトリに 受信したtrapファイルを生成する このファイルを元にsnmpttがnagiosのeventとして通知する nagiosは通知されたeventを元に定義されたActionを起こす

nagiosとの連携

  • nagiosのsubmit_check_resultを利用
  • passive service checkを利用
  • snmpttからのtrapを受信するserviceを1つ定義する
  • このserviceのステータスは手動で確認しないとOKにならない
  • nagiosのfreshness checkを有効にして自動的にステータスを更新するのがよい
  • このserviceを利用するhostを定義する
  • このhostのホスト名はsubmit_check_resultで指定した第一引数と同一の必要がある。第一引数は$rとなっているため、TRAPを送信してきたホスト名となる。このホスト名を用いて定義されたserviceを定義しておかなければならない

この通常方法だと、各ホストのサービス定義にSNMP Traps分を追加する必要があることと、ホスト名にはFQDN名を正確に設定する必要がある

submit_check_resultの引数は4つ

$1 ホスト名。ホスト名の短い名前でサービスが定義されている必要がある
$2 サービス定義名。この名称でサービス名が定義されている必要がある
$3 戻り値。0はOK、1はWARNING、2はCRITICAL、3はUNKNOWNとなる
$4 出力。テキスト文字列として出力される

serviceエントリ

host_name ホスト名
service_description submit_check_resultスクリプトに設定した文字列
is_volatile 1
check_command check_host-alive
max_check_attempts 1
normal_check_interval 1
retry_check_interval 1
active_checks_enabled 0 passive checkしか利用しない
passive_checks_enabled 1
check_period 24×7
notification_interval 31536000 nagiosが許容する最大値(1年)を設定
notification_options w,u,c warningとunknownとcriticalのみ通知し、recoveryは不要
notifications_enabled 1
contact_groups admins

service_descriptionの文字列はsnmptt.confのEXEC行

EXEC /usr/local/nagios/libexec/eventhandlers/submit_check_result $r TRAP 1 "xxxxxx"
で指定した第二引数と同一の必要がある

freshness check

nagios 2.0から導入された概念

freshness serviceはtrap通知のステータスを自動的にOKに変更してくれる

service定義において以下の設定をすると有効になる

freshness_check 1
freshness_threshold 1 リセットするまでの分数
normal_check_interval 1
check_period 24×7