使い方としては、ルーターなどの機器がハングアップしてしまった時に、そのルーターがつながっているリモート遠隔操作できる電源装置に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つの引数はなんでしょうか?
[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するようになっています。
[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されたらエンドレスになってしまいますので。
