現在、Nagiosのアラートメール通知を、サービス毎に行えるようにしているところです。

上記のような仕組みを作る際は、メールテンプレートをどのような形にするか悩むところだと思いますが、今回は可能な限りシンプルにしようと考え、外部ファイルのテキストをevalで変数展開する方法を試してみました。

はじめに、下記のようなメールテンプレートを用意しておきます。

$NOTIFICATIONTYPE $CONTACTGROUPNAME $HOSTNAME $HOSTSTATE

TYPE     : $NOTIFICATIONTYPE($HOSTSTATE)
ACCOUNT  : $CONTACTGROUPNAME
HOST     : $HOSTNAME($HOSTADDRESS)
DATETIME : $LONGDATETIME
OUTPUT   : $HOSTOUTPUT

これを下記のスクリプトで変数展開します。

$CONTACTGROUPNAME = $argv[1];
$HOSTNAME         = $argv[2];
$NOTIFICATIONTYPE = $argv[3];
$HOSTSTATE        = $argv[4];
$HOSTADDRESS      = $argv[5];
$LONGDATETIME     = $argv[6];
$HOSTOUTPUT       = $argv[7];

$template = file_get_contents("/opt/cloudpack//conf/$CONTACTGROUPNAME/nagios/mail/host/$HOSTNAME.txt");
$eval = "return <<

複雑なように見えますが、要点としては外部テキストを下記のように調整して、evalしています。
※タイトルとは関係ないですが外部ファイルの取得は引数によって変更する形です。

return << 外部テキスト
EVAL;

そして下記のように実行すると、

./tmp-nagios-notify-host "admin_cloudpack.jp" "admin-a" "RECOVER" "UP" "xxx.xxx.xxx.xxx" "2011/11/11 11:11:11" ""

正しく変数展開され、下記のようなファイルが出力されます。

RECOVER admin_cloudpack.jp admin-a UP

TYPE     : RECOVER(UP)
ACCOUNT  : admin_cloudpack.jp
HOST     : admin-a(xxx.xxx.xxx.xxx)
DATETIME : 2011/11/11 11:11:11
OUTPUT   :

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら