サーバで動かしている POPFile が落ちてしまうので自動的に復旧する
POPFile をメールサーバ側で運用する1つの方法で書いた際、
2ユーザ分ほど起動してみたのですが、今のところは*ほぼ*快調です。
*ほぼ*というのは、片方のユーザで、たまに POPFile が落ちてしまっているからです。
Nagios で POPFile のポートを監視しているので、落ちたことはわかるのですが、今のところ原因不明です。
となっていましたが、未だ原因わからずままのため、対処療法を施すことにしました。
Nagios で監視し、落ちていたら自動的に起動するようにします。
基本方針
Nagios では問題発生時に連絡するためにメール発信のコマンドやページャの呼び出しコマンドなどを記述することができますが、これを使って自動復旧を行ってみます。
復旧用シェルスクリプトを作成
他でも使えるように、引数を受け取ってそれによって復旧用コマンドを切り替えるようにしています。
$NAGIOSHOME/ubin/recovery.sh
#!/bin/sh
if [ $1 != 'OK' ]; then
case $2 in
POPFile)
/usr/bin/sudo /bin/su - fwdfoo -c /home/fwdfoo/.popfile/popfile.sh > /dev/null 2>&1
;;
*)
echo no such service.
;;
esac
fi
Nagios は、ユーザ nagios で動作しているため、パスワードなしで su を使った他ユーザでのコマンド起動が行えません。そこで、sudo を使って起動できるように登録してあります。
1つめの引数が Nagios のステータス(OK、CRITICAL、WARNING等)です。 OK の場合には、何もしません。
2つめが起動するサービスです。Nagios 側の service_description と同じものを指定します。
Nagios の定義
アラートを上げる時に、上記のシェルスクリプトを起動するようにします。
以下、$NAGIOSHOME は、Nagios のベースディレクトリに書き換えてください。
たとえば、/usr/local/nagios など。
$NAGIOSHOME/etc/misccommands.cfg
上記のシェルスクリプトを呼び出すコマンドの定義です。
# auto recovery
define command{
command_name auto-recovery
command_line $NAGIOSHOME/ubin/recovery.sh $SERVICESTATE$ $SERVICEDESC$
}
1つめの引数で、Nagios のステータス、2つめの引数で service_description を渡しています。
$NAGIOSHOME/etc/contacts.cfg
上記で定義したコマンド(auto-recovery)を呼び出すコンタクト先を定義します。
define contact{
contact_name recovery
alias Auto Recovery
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands auto-recovery
host_notification_commands host-notify-by-email
email root
}
$NAGIOSHOME/etc/contactgroups.cfg
上記のコンタクト先を含むグループを定義します。
define contactgroup{
contactgroup_name recovery
alias Administrators
members user1,user2,recovery
}
通常使っているコンタクトグループに追加してもよかったのですが、とりあえず。
$NAGIOSHOME/etc/services.cfg
POPFile を監視しているサービスのコンタクトグループを上記で定義したグループ(recovery)に変更します。
define service{
use generic-service
service_description POPFile
check_command check_popfile
contact_groups recovery
}
以上で完了
nagios -v nagios.cfg で定義に間違いがないかどうか確認後、nagios のプロセスに HUP シグナルを送って再読込させます。
テスト
手動で POPFile を落とし、しばらく待つと Nagios の PROBLEM alert が飛んできます。
またしばらく待つと、 RECOVERY alert が飛んできました。
うまくいっているようです。