Nagiosのpassive checkとrsyslogを組み合わせてみた(1)

以前rsyslogとNagiosを使ったログチェックの方法として、PostgreSQLを使って定期的にログの中身をチェックする方法を作っていたのだが、( http://d.hatena.ne.jp/aaabbb_200904/20090710/1247242209 ) 他の方法を模索していたところ、 Nagiosの監視方法として、active check (通常のチェック方法) 以外に、 passive check (別のプログラムからのアラート等を受け付ける) が用意されていることがわかった。
http://nagios.sourceforge.net/docs/3_0/passivechecks.html
この機能を使って、critical, emergencyなど緊急性の高いsyslogを、Nagiosのコンソールに表示できないかを確かめてみた。

結果的には、Pythonスクリプトを使って、 rsyslog の結果を編集し、Nagiosのコンソールに表示することができたのだが、そこまでにいくつかの設定が必要だったので、順番に書いていく。

まず最初に、Nagiosのpassive check の仕組みについて記述しておく。passive check では、 Nagios 側にアラート等を送るための名前付きパイプを使い、サービスごとやホストごとの状態の変化を伝達する。

名前付きパイプの位置は、どうもディストリビューションによって違うらしい。筆者の環境ではUbuntu 8.04 のnagios2 (2.11) を使用していたのだが、パイプの位置は、 /var/lib/nagios2/rw/nagios.cmd となっていた。
( この位置は、 cfgファイル内の command_file の位置と等しい。 )
( 名前付きパイプ自体の説明については、こちらを参照。
http://e-words.jp/w/E5908DE5898DE4BB98E3818DE38391E382A4E38397.html )

例えば、 あるホストのpingが手違いでCritical の状態になってしまい、手動でOKの状態にしたい場合、コンソールから、 "Submit passive check result for this service" を使用するのだが、この機能も上のパイプへの書込みを利用しているらしい。rsyslogからのアラートログも、同じようにNagios形式に変換して、パイプに書込みを行えば、rsyslog ==> Nagios の連携が簡単に行える。

マニュアルにある通り、名前付きパイプにサービスの状態を変更するための情報を送るには、

[] PROCESS_SERVICE_CHECK_RESULT;;;
;
(実際には1行)

の形式でパイプに書込みを行う。詳細はマニュアルに譲るが、syslogを変換する上で問題になる部分は、
1. timestamp の形式がEpoch からの秒数 (date +%s で表示される形式)
あたりだろうか。。

それ以外の項目は、基本的にsyslog内の各項目からそのまま生成できるので、受け渡しの方法だけを考えればよい。

試しに、localhost のCurrent Load の状態をWARNINGに変えてみる(この操作は、Nagios CGIからも実施できる)には、

# echo "[$(date +%s)] PROCESS_SERVICE_CHECK_RESULT;localhost;Current Load;1;nnn" >> /var/lib/nagios2/rw/nagios.cmd 

のように書込みをすると、 /var/log/nagios2/nagios.log に

[1254317825] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;localhost;Current Load;1;nnn
[1254317825] SERVICE ALERT: localhost;Current Load;WARNING;SOFT;1;nnn

のような記述が出て、Current Load の状態がWARNINGになる。もちろん、ロードアベレージの値が正常なら、次のチェックの際に値は元に戻る。筆者の環境では次のように表示された。

[1254317845] SERVICE ALERT: localhost;Current Load;OK;SOFT;2;OK - load average: 0.11, 0.29, 0.33

passive check の使い方は大体この通りで、次回以降rsyslog => Python => Nagios での連携方法について書いていくのだが、作業中に詰まった点として、以下にUbuntu(Debian ?? ) 上のNagios 設定の注意を書いておく。 ( /usr/share/doc/nagios2/README.Debian の内容と同様。)

Nagios のpassive check についてなのだが、Ubuntuでは、Nagiosのpassive check がデフォルトでオンになっておらず、 cfgファイル内で、

check_external_commands=1

の設定をする必要がある。それと、デフォルトのパーミッションだと、CGIからpassive check を送ることができないため、(CGIから状態を変更しようとするとエラーになる), パーミッションの調整のため、次のコマンドを実施する。

# /etc/init.d/nagios2 stop
# dpkg-statoverride --update --add nagios www-data 2710 /var/lib/nagios2/rw
# dpkg-statoverride --update --add nagios nagios 751 /var/lib/nagios2
# /etc/init.d/nagios2 start

この2つを実施することで、passive check が手動、CGI 共に使えるようになった。

次回は、rsyslog の記述をPython スクリプトに渡す方法(こちらも名前付きパイプをつかってみた) について書いてみる。