皆さんこんにちは、MSP事業部エンジニアリンググループの池内です。
弊社では監視システムとしてNagiosを利用しています。監視中に発生するアラート通知をメールで受けていますが、実際に運用していると不便なところがあり、最近アラートメール本文のフォーマットをカスタマイズしました。そこで今回は何をどうカスタマイズしたか紹介します。
本記事の概要としては下記になります。
- Nagiosのデフォルト設定では、監視プラグインの標準出力の実行結果をアラートメールに1行分しか出力できない
- Nagios設定ファイル内で定義されているメール通知コマンドをカスタマイズすることにより、監視プラグインの実行結果が複数行あったとしても全てアラートメールに出力できる
なお本記事は想定する読者として、Nagiosの監視設定を1からセットアップできるレベルが前提となっていることをご了承ください。
アラートメールの制約と本記事の目的
Nagiosでは独自に作成したスクリプトの標準出力をアラートメールに含ませられます。この仕組みを活用して、弊社では監視プラグインの出力結果を監視アラートの補足情報として載せています。この情報はNagiosのアラートメールのAdditional Info
部分に記載されます。
ただしデフォルトでは出力できるテキストは1行までという制限があるため、2行目以降のテキストは表示されません。例えばcheck_disk監視プラグインの場合-n
オプションを利用することで、実行結果を複数行にわたって出力できます。
./check_disk -w 10% -c 5% -p / -p /dev -n DISK OK - free space: / 28306 MiB (92.17% inode=99%); /dev 467 MiB (100.00% inode=100%); | /=2401MiB;27636;29171;0;30707 /dev=0MiB;420;443;0;467
しかし実際に送付されるアラートメールは以下のようになります。
Additional Info: DISK WARNING - free space:
そこで本記事では、Nagiosの設定を変更しアラートメールのAdditional Info
を複数行で出力するための方法を紹介します。
監視プラグインの標準出力の仕様について
まずはNagiosが監視プラグインの標準出力をどのように認識しているかNagios Core Plugin APIを参考に確認します。
Nagiosの監視プラグインは実行時に少なくとも1行の標準出力を返す必要があります。監視プラグインの標準出力のフォーマットは下記のように定められています。また標準出力の内容はフォーマットに応じてパースされ、マクロとしてNagiosで扱えます。
TEXT OUTPUT | OPTIONAL PERFDATA LONG TEXT LINE 1 LONG TEXT LINE 2 ... LONG TEXT LINE N | PERFDATA LINE 2 PERFDATA LINE 3 ... PERFDATA LINE N
 マクロ  |  値  |
---|---|
 $SERVICEOUTPUT$  |  TEXT OUTPUT  |
 $SERVICEPERFDATA$  |  OPTIONAL PERFDATA, PERFDATA LINE 2, ..., PERFDATA LINE N  |
 $LONGSERVICEOUTPUT$  |  LONG TEXT LINE 1, ..., LONG TEXT LINE N  |
- 標準出力の1行目(赤色の表記の部分)が
$SERVICEOUTPUT$
にあたります - 標準出力1行目の
|
以降および、2行目以降にある|
以降の部分(黄色の表記)が$SERVICEPERFDATA$
にあたります - 標準出力2行目以降の
|
以前の部分(青色の表記)が$LONGSERVICEOUTPUT$
にあたります
Nagiosのデフォルトの設定でAdditional Info
に出力される内容は$SERVICEOUTPUT$
となります。つまり$SERVICEOUTPUT$
に加えて、2行目以降のテキストが格納されている$LONGSERVICEOUTPUT$
も出力できれば、Additional Info
を複数行で出力できます。
対策
Nagiosが監視プラグインの標準出力をどのように認識しているのか確認できたので、次は実際にAdditional Info
に2行目以降のテキストを出力できるように設定します。
Additional Info
に2行目以降のテキストを出力するには、Commandsに定義されたメール通知コマンドを修正する必要があります。
デフォルトのメール通知コマンドを確認する
まずはデフォルトのメール通知コマンドがどうなっているかを確認します。
Nagiosのアラートメール通知コマンドの設定はソースからインストールした場合は/usr/local/nagios/etc/objects/commands.cfgに、パッケージマネージャーでインストールした場合は/etc/nagios/objects/commands.cfgに設定ファイルがあることが多いです。詳しくはnagios.cfgのcfg_file
ディレクティブから設定ファイルのパスを確認できます。
デフォルトで設定されているアラートメール通知コマンドはnotify-service-by-email
という名前で定義されており、内容は下記のとおりです。
define command { command_name notify-service-by-email command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$ }
ここでアラートメールの件名・本文のフォーマットやメール送信コマンドが定義されています。
command_line部分のAdditional Info:\n\n$SERVICEOUTPUT$\n
という記述に注目してください。ここでAdditional Info
の記載内容が定義されており、$SERVICEOUTPUT$
の内容のみが出力されていることが分かります。
新たにメール通知コマンドを定義する
上記notify-service-by-email
を雛形に、新たにnotify-service-long-output-by-email
という設定を下記内容で作成します。
define command { command_name notify-service-long-output-by-email command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n$LONGSERVICEOUTPUT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$ }
notify-service-by-email
との違いはcommand_line部分のAdditional Info:\n\n$SERVICEOUTPUT$\n$LONGSERVICEOUTPUT$\n
という記述であり、新たに$LONGSERVICEOUTPUT$\n
という記述を追記しています。ここで定義した通知コマンドを使用します。
定義したメール通知コマンドを使って監視する
最後に実際のサービス監視項目が定義した通知コマンドnotify-service-long-output-by-email
を使って通知するように設定します。
自身のNagiosで利用しているContact設定のservice_notification_commands
ディレクティブの値を、先程定義したnotify-service-long-output-by-email
に変更します。
define contact { name generic-contact service_notification_period 24x7 host_notification_period 24x7 service_notification_options w,u,c,r,f,s host_notification_options d,u,r,f,s service_notification_commands notify-service-long-output-by-email host_notification_commands notify-host-by-email register 0 }
特定のサービス監視項目のみにnotify-service-long-output-by-email
を適用したい場合は、新しくcontactの設定を定義するのが良いでしょう。
これで設定は完了です。この設定で送付されたアラートメールは下記のようにAdditional Info
が複数行で出力されます。
Additional Info: DISK WARNING - free space: / 28306 MiB (92.17% inode=99%); /dev 467 MiB (100.00% inode=100%);
まとめ
commands.cfgを調整することによりNagiosのアラートメールにおけるAdditional Info
の部分を複数行で出力する方法を紹介しました。これでアラートメールにより詳細な情報を分かりやすく出力できます。
commands.cfg内のメール通知のコマンド定義を調整することでAdditional Info
部分以外もアラートメールのフォーマットをある程度調整できますので、ぜひ調べてみてください。
備考
今回紹介する事例は下記環境で確認、検証しています。
- OS: Amazon Linux 2
- Nagios: Nagios Core 4.4.9