Nagios のアラート通知を Microsoft Agent に喋らせる
以前から「メール以外で何か他におもしろい通知方法はないかな?」と考えているのですが。。。
Nagios のアラート通知手段を1つ追加してみました。
実用性は今ひとつな気もしますが…
この Micorosft Agent と Becky! を結びつける「MSAgent ポスペ化プラグイン」という Becky! のプラグインがあります。
これを使うと Agent のキャラクタが、メールが到着したらしゃべって知らせてくれたり、メールの本文を読み上げたりといったことができるようになります。
これを組み合わせてみることにしました。
画面上はこんな感じで、これにあわせて喋ります。
イントネーションが微妙におかしいのは毎度のことで。
Microsoft Agent は適切な HTML ファイルを Webサーバに置いておけば InternetExplorer 経由で喋らせることができます。
Microsoft Agent のサイト内、 HTML Web page code samples にサンプルがあります。
この機能を使い Nagios でアラートをあげたい時には HTML ファイルを差し替えることによって喋らせることができるようになります。
HTML ファイルを差し替えるシェルスクリプトを作る
引数によって、作成する HTML ファイルを切り替えるシェルスクリプトを作ります。
alert_agent.sh というファイル名にしました。
alert_agent.sh DOWN hostname
とすると、「hostname が落ちちゃったよ」と喋る HTML を生成します。
alert_agent.sh PROBLEM hostname http CRITICAL 'connection refused'
とすると、「hostname っていうサーバーの http っていうサービスで問題が起こっています。ステータスは~~」と喋る HTML を生成します。第一引数は、「WARNING」でも同じ動きをします。
第一引数にそれ以外を与えると、喋らない HTML を生成します。
ブラウザ側で定期的に再読込させる必要があるため、
<META HTTP-EQUIV="REFRESH" CONTENT=600">
で10分に一度再読込させています。
MS Agent の呼び出しがHTML Web page code samples に載っているのに比べて単純化されていますが、これは、Becky!(MSAgent ポスペ化プラグイン)で既に Agent を呼び出し済みで常駐しているからです。
以下、ヒアドキュメントを使っているので読みにくいですが、至極単純なシェルスクリプトです。
#!/bin/sh
ALERTHTMLFILE=$DOCUMENTROOT/alert.html # $DOCUMENTROOT は apache の DocumentRoot ディレクトリに変える
if [ $1 = "PROBLEM" -o $1 = "WARNING" ]; then
cat > $ALERTHTMLFILE << _EOF
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=EUC_JP">
<META HTTP-EQUIV="REFRESH" CONTENT=600">
</HEAD>
<BODY>
問題発生
<OBJECT ID="AgentControl" width=0 height=0
CLASSID="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F"
CODEBASE="#VERSION=2,0,0,0">
</OBJECT>
<OBJECT ID="TruVoice" width=0 height=0
CLASSID="CLSID:B8F2846E-CE36-11D0-AC83-00C04FD97575"
CODEBASE="#VERSION=6,0,0,0">
</OBJECT>
<SCRIPT language="VBScript">
Sub window_OnLoad
AgentControl.Connected = True
AgentControl.Characters.Load "Peedy"
Set Peedy = AgentControl.Characters("Peedy")
Peedy.Play "Surprised"
Peedy.Speak "ちょっと問題がおこったみたいなので、お知らせします。"
Peedy.Speak "$2 っていうサーバーの、 $3 っていうサービスで問題が起こっています。"
Peedy.Speak "ステータスは、$4 です。"
Peedy.Speak "詳しいエラーは、$5 ということだそうです。"
END SUB
</SCRIPT>
</BODY>
</HTML>
_EOF
elif [ $1 = "DOWN" ]; then
cat > $ALERTHTMLFILE << _EOF
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=EUC_JP">
<META HTTP-EQUIV="REFRESH" CONTENT=600">
</HEAD>
<BODY>
問題発生
<OBJECT ID="AgentControl" width=0 height=0
CLASSID="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F"
CODEBASE="#VERSION=2,0,0,0">
</OBJECT>
<OBJECT ID="TruVoice" width=0 height=0
CLASSID="CLSID:B8F2846E-CE36-11D0-AC83-00C04FD97575"
CODEBASE="#VERSION=6,0,0,0">
</OBJECT>
<SCRIPT language="VBScript">
Sub window_OnLoad
AgentControl.Connected = True
AgentControl.Characters.Load "Peedy"
Set Peedy = AgentControl.Characters("Peedy")
Peedy.Play "Surprised"
Peedy.Speak "ちょっと問題がおこったみたいなので、お知らせします。"
Peedy.Speak "$2 っていうサーバーが落ちちゃったみたいです。"
END SUB
</SCRIPT>
</BODY>
</HTML>
_EOF
else
cat > $ALERTHTMLFILE << _EOF
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=EUC_JP">
<META HTTP-EQUIV="REFRESH" CONTENT=600">
</HEAD>
<BODY>
みんな元気
</BODY>
</HTML>
_EOF
fi
Nagios に通知手段を定義する
$NAGIOSHOME/etc/misccommands.cfg に、先ほど作ったシェルスクリプトを呼び出す2つの通知手段を追加します。
サービスダウン時とホストダウン時の通知手段です。
# 以下の「$NAGIOSHOME/etc/agent_alert.sh」は、先ほど作ったシェルスクリプトを置いたパスです。
# 'notify-by-msagent' command definition
define command{
command_name notify-by-msagent
command_line $NAGIOSHOME/etc/agent_alert.sh $NOTIFICATIONTYPE$ $HOSTNAME$ $SERVICEDESC$ $SERVICESTATE$ '$OUTPUT$'
}
# 'host-notify-by-msagent' command definition
define command{
command_name host-notify-by-msagent
command_line $NAGIOSHOME/etc/agent_alert.sh $HOSTSTATE$ $HOSTNAME$
}
contacts.cfg と contactgroups.cfg に追加する。
$NAGIOSHOME/etc/contacts.cfg にコンタクト先を追加します。
service_notification_commands と host_notification_commands に先ほど定義した通知手段を指定します。
define contact{
contact_name msagent
alias MS Agent
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-by-msagent
host_notification_commands host-notify-by-msagent
email root
}
$NAGIOSHOME/etc/contactgroups.cfg の members に、先ほど定義したコンタクト先を追加します。
define contactgroup{
contactgroup_name admins
alias Administrators
members root,msagent
}
以上でおしまい。
後は、この HTML を InternetExplorer で開きっぱなしにしておくだけです。
でも、問題が2つあります。
- 複数のアラートが発生した時に片方が RECOVERY すると、もう1つが RECOVERY していなくても喋らなくなります。
- apache が停止してしまった時にはアラートをあげることができません。
まぁ、常用するかどうか微妙です…。
誰もいないの喋ってても意味ないし。夜中に突然喋り始めたらちょっと怖いし。