HEARTBEATS

Nagiosのアラートメールに複数行のAdditional Infoを出力する

   

皆さんこんにちは、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 

引用:Nagios Core Plugin API

  • 標準出力の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

参考資料