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の設定を残すだけ。まずアイテムを作成します。
4.アイテム取得とインベントリの確認
アイテム作成後、インベントリに反映されるか確認します。その際、インベントリ設定は「自動」になっていないと 「ホストインベントリフィールドの自動設定」 が有効になりませんので注意してください。
「自動」にした後、該当インベントリに反映されていることを確認します。
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}