Zabbixのアラート通知メールにホストの名前解決結果を表示する

Zabbixで遠隔ルータのping監視を行い、ping断検知でアラート通知メールを送信しています。
メール本文には対象ノードのIPアドレスを記載することも出来ますが、対象ノードをIPアドレスで指定している場合しか表示されません。これを創意工夫で乗り越えてみます。

1.そもそもどんな場合に必要なのか?

固定IPを取得していない回線を利用しているルータをダイナミックDNSを利用して監視している場合に役立ちます。というのも、固定IPでない場合は回線のセッションが切れるとIPアドレスが変わる可能性があります。

そうするとping監視でダウンからの復旧を検知しても、実は復旧ではなくIPアドレスの再利用で別ノードにpingが届くようになっただけ、ということがたまにありました。そこでホスト名の名前解決結果がメールに表示されれば、IPアドレスの変化を確かめることができるはず!との考えが発端です。

2.名前解決スクリプトをつくる

やり方としては任意の文字列を名前解決可能なスクリプトを作り、Zabbix上で利用できるようにします。スクリプトはあぱーぶろぐさんの記事「Zabbix ドメイン名ハイジャック(ドメインの乗っ取り)を監視」を参考にさせて貰いました。

■Zabbix ドメイン名ハイジャック(ドメインの乗っ取り)を監視
http://blog.apar.jp/php/910/

2.1.スクリプトを修正する

今回のスクリプト修正につき気をつけたのは次の5点です。

  • 名前解決だけ出来ればよい
  • 名前解決したいFQDNは監視ホストごとに変更するので第1引数で処理する
  • 第2引数以降は不要
  • 標準出力結果に改行コードを含めるため PHP_EOL を忘れずに
  • 参考サイトはphpコードを閉めていないので忘れずに付け加える
# cd /usr/lib/zabbix/externalscripts/
# vi nslookup.php
#!/usr/bin/php
< ?php
$domain = $argv[1];

// ドメイン名に対応するIPアドレスを取得
$answers = dns_get_record($domain, DNS_A);

// IPアドレスを抽出(複数の場合もある)
for ($i = 0; $i < count($answers); $i++) {
    $ips[] = $answers[$i]['ip'];
}
$ips_sorted = sortIps($ips);
$getIpAddr = ($ips_sorted) ? implode(',', $ips_sorted) : null;

print($getIpAddr).PHP_EOL;

// 複数IPアドレスのソート処理関数
function sortIps($ips)
{
    if ($ips) {
        sort($ips);
        return $ips;
    }
}
?># chown zabbix:zabbix nslookup.php
# chmod 700 nslookup.php

# ls -alh
合計 12K
drwxr-xr-x 2 root   root   4.0K  4月  4 12:22 2015 .
drwxr-xr-x 4 root   root   4.0K  4月 15 11:01 2014 ..
-rwx------ 1 zabbix zabbix  542  4月  4 12:22 2015 nslookup.php

2-2.スクリプト動作確認

スクリプトが完成したら動作テストです。nslookup.phpを実行し第1引数にドメインを入れると、名前解決されたIPアドレスが表示されます。なお「/usr/lib/zabbix/externalscripts/」はZabbixが利用できる外部スクリプトを設置可能なディレクトリです。

# cd /usr/lib/zabbix/externalscripts/
# ./nslookup.php 0xdeadbeaf
22.173.190.175
#

3.Zabbixのアイテムを作成する

スクリプトが完成したら後はZabbixの設定を残すだけ。まずアイテムを作成します。

タイプ 外部チェック /usr/lib/zabbix/externalscripts/ の外部スクリプトを実行する場合に選択
キー nslookup.php[{$DNS}] nslookup.phpに渡す引数を指定します。{$DNS}はホストのマクロで定義します。zabbix-dns-macro
ホストインベントリフィールドの自動設定 OOB IPアドレス Zabbixのアラートメール本文には別アイテムの結果を記載できない(元はping監視アイテムなので。)そこで利用していないインベントリにnslookup.phpの結果を自動反映させ、このインベントリをメールに記載させるようにする。
なおOOBとはアウトオブバンドのこと。OOB IPアドレスとは管理用ポートのこと。

zabbix-ddns-item

4.アイテム取得とインベントリの確認

アイテム作成後、インベントリに反映されるか確認します。その際、インベントリ設定は「自動」になっていないと 「ホストインベントリフィールドの自動設定」 が有効になりませんので注意してください。
zabbix-hostinventory

「自動」にした後、該当インベントリに反映されていることを確認します。
zabbix-inventory-oobip

5.メールのメッセージを設定

最後にメッセージ設定をおこないます。{INVENTORY.OOB.IP1}を設定することでOOB IPアドレスに登録したnslookup.phpの名前解決結果をメール本文に表示可能になります。

検知日時: {EVENT.DATE} {EVENT.TIME}
ホスト名: {HOSTNAME1} : ({HOST.IP1}{INVENTORY.OOB.IP1})
機器:{PROFILE.HARDWARE1}
----
連絡先:{PROFILE.CONTACT1}
発生拠点名/住所:
{PROFILE.LOCATION1}
----
備考:{PROFILE.NOTES1}