nagiosからスクリプトを発動させる

|

使い方としては、ルーターなどの機器がハングアップしてしまった時に、そのルーターがつながっているリモート遠隔操作できる電源装置にtelnetなどでログインしてリブート操作を行うような場合に使えます。

設定はこんな感じです。 event_handler を使うのがポイントです。
define service {
       use                             generic-service
       service_description             PING
       host_name                       router
       max_check_attempts              1
       normal_check_interval           1
       retry_check_interval            1
       contact_groups                  admins
       check_command                   check_ping!1000.0,60%!1000.0,100%
       event_handler                   REBOOT-ROUTER
}
この設定は1分おきにに"router"にpingを打ち、 反応がない場合や復旧したときのような「状態変化」が起きたときに、 「REBOOT-ROUTER」というスクリプトをCallします。 ■「REBOOT-ROUTER」はどこに定義されているか
event_handler                   REBOOT-ROUTER
の部分ですが、checkcommands.cfg内で定義します。
#
# 'restart-router' command definition
#
define command{
	command_name    REBOOT-ROUTER
	command_line    /usr/lib/nagios/plugins/eventhandlers/reboot-router $SERVICESTATE$ $STATETYPE$ $SERVICEATTEMPT$
}

/usr/lib/nagios/plugins/eventhandlers/reboot-routerというスクリプトを動かしているのはわかるとして、
$SERVICESTATE$
$STATETYPE$
$SERVICEATTEMPT$
という3つの引数はなんでしょうか?

■nagiosの「状態変化」とは何か 実際に監視しているrouterから反応がなくなったときのnagiosのログはこのようになります。
[02-08-2006 10:46:52] HOST ALERT: router;DOWN;SOFT;1;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:47:02] HOST ALERT: router;DOWN;SOFT;2;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:47:12] HOST ALERT: router;DOWN;SOFT;3;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:47:22] HOST ALERT: router;DOWN;SOFT;4;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:47:32] HOST ALERT: router;DOWN;SOFT;5;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:47:42] HOST ALERT: router;DOWN;SOFT;6;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:47:52] HOST ALERT: router;DOWN;SOFT;7;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:48:02] HOST ALERT: router;DOWN;SOFT;8;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:48:12] HOST ALERT: router;DOWN;SOFT;9;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:48:22] HOST ALERT: router;DOWN;HARD;10;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:48:22] SERVICE ALERT: router;PING;CRITICAL;HARD;1;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:48:22] SERVICE EVENT HANDLER: router;PING;CRITICAL;HARD;1;REBOOT-ROUTER
最後から3行目から2行目にかけての
[02-08-2006 10:48:22] HOST ALERT: router;DOWN;HARD;10;CRITICAL - Plugin timed out after 10 seconds
[02-08-2006 10:48:22] SERVICE ALERT: router;PING;CRITICAL;HARD;1;CRITICAL - Plugin timed out after 10 seconds
が「状態変化」です。 「状態変化」がおきると、EVENT HANDLERのREBOOT-ROUTERがCallされます。
[02-08-2006 10:48:22] SERVICE EVENT HANDLER: router;PING;CRITICAL;HARD;1;REBOOT-ROUTER
このとき、 $SERVICESTATE$ に、CRITICAL $STATETYPE$ に、HARD $SERVICEATTEMPT$ に、1 が渡されます。

■スクリプト"REBOOT-ROUTER"ではどうなっているか では、/usr/lib/nagios/plugins/eventhandlers/reboot-routerを見てます。

#!/bin/sh

# # reboot-router $SERVICESTATE$,$STATETYPE$,$SERVICEATTEMPT$ #

# What state is the ROUTER ? case "$1" in OK) ;; WARNING) ;; UNKNOWN) ;; CRITICAL) # $SERVICESTATE$が"CRITICAL"だった場合 case "$2" in SOFT) ;; HARD) # $STATETYPE$が"HARD"だった場合 case "$3" in 1) # $SERVICEATTEMPT$が"1"だった場合 echo -n "hard" /var/log/nagios/Router_Reboot/hoge.sh # このスクリプトが発動する ;; esac ;; esac ;; esac exit 0

このように、
$SERVICESTATE$ に、CRITICAL、かつ、
$STATETYPE$ に、HARD、かつ、
$SERVICEATTEMPT$ に、1
の条件がすべてそろったときにだけ、リモート電源操作スクリプトの
"/var/log/nagios/Router_Reboot/hoge.sh"をCallするようになっています。

■なぜ引数によって条件分岐するようにしているのか これはなぜかというと、"router"が復旧したときのログに関係があります。
[02-08-2006 10:50:02] HOST ALERT: router;UP;HARD;1;PING OK - Packet loss = 0%, RTA = 0.72 ms
[02-08-2006 10:50:10] SERVICE ALERT: router;PING;OK;HARD;1;PING OK - Packet loss = 20%, RTA = 4.21 ms
[02-08-2006 10:50:10] SERVICE EVENT HANDLER: router;PING;OK;HARD;1;REBOOT-ROUTER
復旧したときも「状態変化」なので、EVENT HANDLERでREBOOT-ROUTERがCallされます。 ただし、このときの引数は $SERVICESTATE$ に、OK $STATETYPE$ に、HARD $SERVICEATTEMPT$ に、1 であり、shスクリプトの条件分岐によって、 リモート電源操作スクリプト"/var/log/nagios/Router_Reboot/hoge.sh" はCallしないようになっています。 復旧したときに、また電源をon/offされたらエンドレスになってしまいますので。

 

このブログ記事について

このページは、くわぞうが2006年5月12日 17:15に書いたブログ記事です。

ひとつ前のブログ記事は「windowsのログをsyslogで収集する」です。

次のブログ記事は「GetifをつかってMIBからOIDを調べる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.1