17. 複数条件監視(check_multi)
17.1. check_multi について
check_multi はサードパーティ製の Nagios Plugin です。オープンソースソフトウェアとして公開されております。
https://github.com/flackem/check_multi
check_multi を利用することで1サービスで複数の監視を行うことができるようになり、意図した条件の場合のみ障害を発生させるような柔軟な対応を行うことが可能になります。
例: 複数のバーチャルホストの監視を行い、いずれか1つでも障害が発生した場合ステータス状態 CRITICAL にする。
Web サービス (Apache 等) が落ちた際に大量に障害が上がることを抑制できます。
なお、本記事は check_multi と X-MON の連携について説明するものとなります。
check_multi については X-MON の製品として含まれず、また動作については X-MON サポートの対象外となりますので、予めご了承ください。
17.2. 事前準備
事前準備作業は X-MON サーバ内で行います。SSH クライアントを利用し、 X-MONサーバへログインしてください。
注釈
本手順で利用する check_multi は、 2024/10/09 時点での安定版になります。
最新のインストール方法については https://github.com/flackem/check_multi/blob/next/doc/installation.md をご参照ください。
17.2.1. check_multi のビルド手順
下記の手順でダウンロードしてください。
curl -O -L https://github.com/flackem/check_multi/archive/refs/tags/0.26.tar.gz
tar zxvf ./0.26.tar.gz
解凍後、解凍先ディレクトリ内へ遷移します。
cd check_multi-0.26/
次の手順でインストールを行います。
./configure; make all; make install
インストール後、 /usr/local/nagios/libexec/ ディレクトリ内にある check_multi コマンドをダウンロードしておきます。
17.2.2. ベースとなるファイルの作成手順
複数の監視を行うには check_multi のプラグインだけでなく、プラグインが利用するファイルを用意する必要があります。
今回は仮に /usr/local/check_multi というディレクトリを作成して設置します。
mkdir /usr/local/check_multi
chown -R x-mon.x-mon /usr/local/check_multi
また、今回は仮にプラグインで利用するファイル名を sample.cmd
としておきます。.cmd
の拡張子であれば、 sample
部分は任意の値で構いません。
vi /usr/local/check_multi/sample.cmd
vi で開いた後、以下の文をコピー & ペーストし保存します。
eeval [ hostaddress ] =
if ("$HOSTADDRESS$") {
return "$HOSTADDRESS$";
} else {
print "Error: no HOSTADDRESS defined. Exit.\n";
exit 3;
}
command [ping] = check_ping -H $HOSTADDRESS$ -w $ARG1$,$ARG2$% -c $ARG3$,$ARG4$% -p $ARG5$ -t $ARG6$
command [ssh] = check_ssh -H $HOSTADDRESS$ -p $ARG7$ -t $ARG8$
この文では次の動作を行います。
$HOSTADDRESS$
が引数として渡されているかチェック。command 行に関しては、監視を行いたい内容に変えていただいて結構です。
定義方法に関しては、 check_multi で利用する ***.cmd ファイルの記載方法について をご参照ください。
17.3. X-MON設定手順
17.3.1. check_multi のアップロード手順
まず、check_multi のビルド手順でインストール作業後ダウンロードしておいた、/usr/local/nagios/libexec/ ディレクトリ内にある check_multi を X-MON に設定していきます。
監視プラグイン check_multi のアップロード手順より説明いたします。
画面左上メニューにカーソルを移動させ、「高度な設定」 の 「独自プラグイン管理」 をクリックします。
「独自プラグイン管理」画面では監視プラグインの追加・オプションのカスタマイズなどが行えます。プラグインのアップロードは 「監視コマンド一覧」をクリックします。
check_multi のアップロードを行うので、[ 登録 ] ボタンをクリックし、アップロード画面へ遷移後、check_multi を選択し [ 登録と承認 ] ボタンをクリックします。
これで check_multi のアップロードは完了です。
17.3.2. サービス監視用コマンドの追加
監視プラグイン check_multi を X-MON へアップロードするだけでは、まだ利用できません。サービス監視として利用できるように設定していきます。
「独自プラグイン管理」画面より 「監視プラグイン設定」を選択します。
新規登録を行う場合、[ 登録 ] ボタンをクリックします。
監視プラグインの設定画面へ遷移した後、以下の項目に情報を入力した後、[ 詳細な設定へ進む ] をクリックします。
項目名 |
内容 |
---|---|
コマンドID (英数字) |
任意のユニークなIDを指定してください。
後からの編集は行えません。
|
コマンド名称 |
任意の名称を指定してください。
他のコマンド名称と重複していても問題ありませんが、
わかりやすい名称を利用することをお勧めします。
日本語も利用可能です。
|
コマンドタイプ |
ホスト監視として利用するか、サービス監視として利用するか指定してください。 |
コマンドグループ |
ホスト、またはサービス監視用コマンドとして利用する際、
グループ単位で絞り込みます。どのグループに所属させるか指定してください。
|
実行コマンド |
アップロードしたcheck_multiを指定してください。 |
引数 |
監視プラグインのPATHや事前準備として作成しておいたファイルを
指定する必要があります。次の3オプションは必ず指定する必要があります。
-l /opt/x-mon/lib/plugins/ -f /usr/local/check_multi/(作成したファイル名).cmd
--set HOSTADDRESS=$HOSTADDRESS$
|
引数には、事前準備で作成したファイル内の監視数に合わせオプションの数を調整する必要があります。
事前準備で作成した ping と sshの2つの監視を行う場合、 $ARG1から8まで指定します。
eeval [ hostaddress ] =
if ("$HOSTADDRESS$") {
return "$HOSTADDRESS$";
} else {
print "Error: no HOSTADDRESS defined. Exit.\n";
exit 3;
}
command [ping] = check_ping -H $HOSTADDRESS$ -w $ARG1$,$ARG2$% -c $ARG3$,$ARG4$% -p $ARG5$ -t $ARG6$
command [ssh] = check_ssh -H $HOSTADDRESS$ -p $ARG7$ -t $ARG8$
引数項目には以下のように入力します。
-l /opt/x-mon/lib/plugins/ -f /usr/local/check_multi/sample.cmd --set
HOSTADDRESS=$HOSTADDRESS$ --set ARG1=300 --set ARG2=30 --set
ARG3=500 --set ARG4=50 --set ARG5=5 --set ARG6=10 --set ARG7=22
--set ARG8=10
あとは、ホストの場合ホストの新規登録または編集画面、サービスの場合サービスの新規登録または編集画面へ遷移し、登録した監視用コマンドを選択し、 X-MON の再起動を行えば完了です。
うまく監視が始まると、ステータス情報内に各監視結果が表示されます。
17.4. check_multi で利用する ***.cmd ファイルの記載方法について
cmdファイル内で利用できる定義のうち、利用頻度の高い3つの定義を紹介します。
eeval
command
state
17.4.1. eeval
eeval では、 Perl のように柔軟な記述が可能です。もちろん my
でバリデーションの定義や foreach
構文なども利用できます。以下の2例は $HOSTADDRESS$
が存在しない場合、UNKNOWN エラー、 $TIMEOUT$
が空値だった場合デフォルト2を指定といった処理を行っています。
eeval [ hostaddress ] =
if ("$HOSTADDRESS$") {
return "$HOSTADDRESS$";
} else {
print "Error: no HOSTADDRESS defined. Exit.\n";
exit 3;
}
eeval [ timeout ] = ( "$TIMEOUT$" eq "") ? "2" : "$TIMEOUT$";
command [ping] = check_ping -H $HOSTADDRESS$ -w $ARG1$,$ARG2$% -c $ARG3$,$ARG4$% -p $ARG5$ -t $ARG6$
command [ssh] = check_ssh -H $HOSTADDRESS$ -p $ARG7$ -t $ARG8$
17.4.2. command
実行する監視を指定します。
構文は以下の通りです。
command [ 任意の名称 ] = 実行内容
任意の名称には [A-Z] [a-z] [0-9] の文字を利用ください。
eeval [ hostaddress ] =
if ("$HOSTADDRESS$") {
return "$HOSTADDRESS$";
} else {
print "Error: no HOSTADDRESS defined. Exit.\n";
exit 3;
}
eeval [ timeout ] = ( "$TIMEOUT$" eq "") ? "2" : "$TIMEOUT$";
command [ping] = check_ping -H $HOSTADDRESS$ -w $ARG1$,$ARG2$% -c $ARG3$,$ARG4$% -p $ARG5$ -t $ARG6$
command [ssh] = check_ssh -H $HOSTADDRESS$ -p $ARG7$ -t $ARG8$
実行内容は、管理者メニュー 「各種設定表示」 内の 「コマンド」 画面より確認できます。
「コマンドライン」 項目と 「引数n」 項目を利用します。また、コマンドライン項目の先頭 $USER1$/
は除外したものを定義内に利用するようにしてください。
例えば check_xmon3_ping の内容を実行内容に指定したい場合は、 check_xmon3_ping コマンドの「コマンドライン」行を利用します。
例) FTP監視を行う場合
command [ ftp ] = check_ftp -H $HOSTADDRESS$ -t $ARG1$ -p $ARG2$
$ARG1$
は引数1項目を確認し “タイムアウト(秒)”、 $ARG2$
はポート番号を “監視プラグイン設定” より確認し、指定します。
17.4.3. state
必須定義ではありません。
state を定義しない場合、 command 定義のうち OK ステータスではないステータスを探し、最高重症度のステータスを返します。
評価順序は次の通りです。
重症度 |
ステータス |
---|---|
↑重症 |
CRITICAL |
WARNING |
|
↓軽症 |
UNKNOWN |
OK |
構文は以下の通りです。
state [ OK | UNKNOWN | WARNING | CRITICAL ] = 判定内容
state の定義方法は複数存在します。
ステータス状態数をカウントする
以下の例は CRITICAL が1件より多く存在する場合 CRITICAL と判定します。
command [ping] = check_ping -H $HOSTADDRESS$ -w $ARG1$,$ARG2$% -c $ARG3$,$ARG4$% -p $ARG5$ -t $ARG6$
command [ssh] = check_ssh -H $HOSTADDRESS$ -p $ARG7$ -t $ARG8$
state [ CRITICAL ] = COUNT(CRITICAL) > 1
コマンド毎にステータスを判定する
command [***]
で定義した任意の名称を利用し $STATE_(任意の名称)$
と記載すると、ステータス状態を利用できます。
また $OK
、 $WARNING
など各ステータス名前に $
を付けることで判定に利用できます。
以下の例は ping 監視が OK 以外のステータスを返す場合、 CRITICAL と判定します。
command [ping] = check_ping -H $HOSTADDRESS$ -w $ARG1$,$ARG2$% -c $ARG3$,$ARG4$% -p $ARG5$ -t $ARG6$
command [ssh] = check_ssh -H $HOSTADDRESS$ -p $ARG7$ -t $ARG8$
state [ CRITICAL ] = $STATE_ping$ != $OK
正規表現で判定する
以下の例は ping 監視が「PING OK」という文字列を返さない場合、 CRITICAL と判定します。
command [ping] = check_ping -H $HOSTADDRESS$ -w $ARG1$,$ARG2$% -c $ARG3$,$ARG4$% -p $ARG5$ -t $ARG6$
command [ssh] = check_ssh -H $HOSTADDRESS$ -p $ARG7$ -t $ARG8$
state [ CRITICAL ] = "$ping$" !~ /PING OK/
判定内容には Perl 的なスタイルで論理式を書き上げることが可能です。
($STATE_diskroot$ == $CRITICAL || $STATE_diskopt == $CRITICAL)
Perl の演算子は許可されているので組み合わせることで柔軟な判定を設定することが可能です。
17.5. 設定の応用
サービス監視用コマンドの追加 監視プラグインの設定で以下のように記載をしましたが、応用を効かすことが可能です。
-l /opt/x-mon/lib/plugins/ -f /usr/local/check_multi/sample.cmd --set
HOSTADDRESS=$HOSTADDRESS$ --set ARG1=300 --set ARG2=30 --set
ARG3=500 --set ARG4=50 --set ARG5=5 --set ARG6=10 --set ARG7=22
--set ARG8=10
2つ以上のサービスで利用する場合、監視プラグインを複数用意してもかまいませんが、以下のように記載をすることで引数をサービスの登録・編集画面で設定できるようになります。
-l /opt/x-mon/lib/plugins/ -f /usr/local/check_multi/libexec_test.cmd
--set HOSTADDRESS=$HOSTADDRESS$ --set ARG1=$ARG1$ --set ARG2=$ARG2$
--set ARG3=$ARG3$ --set ARG4=$ARG4$ --set ARG5=$ARG5$ --set
ARG6=$ARG6$ --set ARG7=$ARG7$ --set ARG8=$ARG8$
設定画面での表示
ここでは、パラメタを引数の項目名、およびデフォルト名を下記のように設定しました。
項目名 |
デフォルト値 |
---|---|
ping ラウンドトリップタイム WARNING しきい値 (平均 ms) |
300 |
ping パケットロス率 WARNING しきい値 (%) |
30 |
ping ラウンドトリップタイム CRITICAL しきい値 (平均 ms) |
500 |
ping パケットロス率 CRITICAL しきい値 (%) |
50 |
ping 送信回数 (回) |
5 |
ping タイムアウト (秒) |
10 |
ssh ポート番号 |
22 |
ssh タイムアウト (秒) |
10 |
設定画面上の表示
また、逆にすべての引数を変更する必要がない場合などは ***.cmd
内に直接書き込むことも可能です。
eeval [ hostaddress ] =
if ("$HOSTADDRESS$") {
return "$HOSTADDRESS$";
} else {
print "Error: no HOSTADDRESS defined. Exit.\n";
exit 3;
}
command [ping] = check_ping -H $HOSTADDRESS$ -w 300,30% -c 500,50% -p 5 -t 10
command [ssh] = check_ssh -H $HOSTADDRESS$ -p 22 -t 10
監視内容や利用用途に合わせ、スタイルを変更すると使い勝手も良くなります。