こんにちは。ハートビーツ運用スタッフの津田です。
ハートビーツからお届けする技術情報の初回シリーズ、Nagiosについての第4回です。
第3回ではNagiosの監視プラグインで、aptでインストールできるものをご紹介しましたので
今回は自作監視プラグインの作り方をご紹介します。
(ただし、ここではサービス監視に関するものをご紹介します。ホスト監視についてや、
細かい仕様については公式ドキュメントのNagios Plugin APIなどをご覧下さい。)
"作り方"と言っても、専用のプログラミング言語があるわけではありません。
プラグインを使って監視をしたいサーバで動くプログラミング言語であれば、どんな言語でも構いません。 前回ご紹介したプラグインはC言語で書かれていますが、シェルスクリプトや Perl,Ruby,Pythonで書いても構わないんです。
Nagiosで動くプラグインを作るための2つの約束事を、順番にご紹介しましょう。
約束事1:プラグイン自体の返り値が0,1,2,3のどれかであること
プラグインの終了コードは、サービスのプラグインとして使う場合は
- 0:OK
- 1:WARNING
- 2:CRITICAL
- 3:UNKNOWN
を表します。例えばシェルスクリプトであればexitコマンドで 終了コードを指定してプログラムを終了することが出来ます。
約束事2:最低でも一行のテキストを標準出力へ出力すること
終了コードの補足情報として、テキストを1行持たせることが出来ます。 例えばシェルスクリプトであれば、echoコマンドなどを使うだけです。 ただし2行目以降は無視されてしまいますので、改行をいれずに出力して下さい。 1行も出力が無い場合にはNagios側がエラーと見なしてしまい、UNKNOWNとして補足されてしまいます。
サンプルコード
以上を踏まえたcheck_dummy
をシェルスクリプトで簡単に作ってみましょう。
check_dummy
はもらった引数が0,1,2,3であれば、それに応じたステータスをそのまま返すプラグインです。
#!/bin/sh
# 終了コード
OK=0
WARNING=1
CRITICAL=2
UNKNOWN=3
# オプションを1つ受け取って、変数 status に格納します。
if [ $# != 1 ]
then
echo "Just 1 argument is permitted."
exit $UNKNOWN
else
status=$1
fi
# 変数 status が 0,1,2,3 のどれかなら、それに応じたステータスを返し、終了します。
# 0,1,2,3 以外であれば UNKNOWN としてみましょう。
case $status in
0) echo "** OK **"
exit $OK ;;
1) echo "** WARNING **"
exit $WARNING ;;
2) echo "** CRITICAL **"
exit $CRITICAL ;;
3) echo "** UNKNOWN **"
exit $UNKNOWN ;;
*) echo "The argument $status is not permitted."
exit $UNKNOWN ;;
esac
# 上で分岐が網羅されていれば、ここには来ませんが、念のため。
echo "** Error **"
exit $UNKNOWN
とても簡単なスクリプトでしたが、雰囲気はつかんで頂けたでしょうか?
応用例
ハートビーツでは主にaptでインストールできるプラグインを使用していますが、各案件に応じたプラグインを作成することもよくあります。
例えば1時間に3通受信して欲しいメールがあり、3通未満であればエラーを出すような監視がしたいとしましょう。 メールに対する監視であれば、Procmailと連携させるととても便利です。
受信して欲しいメールが来たら、Procmailから何らかのスクリプトへ処理を受け渡し、どこかのファイルへ受信数を保存します。プラグインとして実装すべき部分は、その保存された受信数を見に行き、ある時間に3通未満であればWARNINGやCRITICALとする部分のみです。
他には、会員制のホームページがあったとして、ログインした後に所定のページを回るまでに何秒かかるかを監視することも出来ます。 弊社ではLWP::UserAgentを利用して、Perlでこれを実装しています。
今あるプラグインを無理に作らなくても結構ですが、少し手を加えることでNagiosで出来ることはグンと広がります。是非挑戦してみてください!