14. 複数条件監視(check_multi)

14.1. check_multi について

check_multi を利用することで1サービスで複数の監視を行うことができるようになり、意図した条件の場合のみ障害を発生させるような柔軟な対応を行うことが可能になります。

例:複数のバーチャルホストの監視を行い、いずれか1つでも障害が発生した場合ステータス状態 CRITICAL にする。

check_multi_sample

HTTPが落ちた際に大量に障害が上がることを抑制できます。

check_multi_sample_http

14.2. 事前準備

事前準備作業はX-MONサーバ内で行います。SSHクライアントを利用し、X-MONサーバへログインしてください。

14.2.1. check_multi のビルド手順

check_multi は以下のサイトよりダウンロードします。

# wget http://my-plugin.de/check_multi/check_multi-stable-0.26.tar.gz

  • 2015/07/16 時点での安定版になります。

ダウンロードしたファイルを解凍します。

# tar zxvf check_multi-stable-0.26.tar.gz

解凍後、解凍先ディレクトリ内へ遷移します。

# cd check_multi-0.26/

次の手順でインストールを行います。

# ./configure; make all; make install

インストール後、/usr/local/nagios/libexec/ ディレクトリ内にあるcheck_multiをダウンロードしておきます。

14.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 としておきます。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$

この文では次の動作を行います。

1. $HOSTADDRESS$ が引数として渡されているかチェック
渡されていない場合、ステータスUNKNOWNでエラー出力
2. PING監視
3. SSH監視
4. PING監視 or SSH監視どちらかで障害を返す場合、障害ステータスでエラー出力

command 行に関しては、監視を行いたい内容に変えていただいて結構です。

定義方法に関しては、 check_multi で利用する ***.cmd ファイルの記載方法について をご参照ください。

14.3. X-MON設定手順

14.3.1. check_multi のアップロード手順

まず、check_multi のビルド手順でインストール作業後ダウンロードしておいた、/usr/local/nagios/libexec/ ディレクトリ内にあるcheck_multiをX-MONに設定していきます。

監視プラグイン check_multi のアップロード手順より説明いたします。

画面左上メニューにカーソルを移動させ、”高度な設定” の ”独自プラグイン管理” をクリックします。

check_multi_advanced_settings

“独自プラグイン管理” 画面では監視プラグインの追加・オプションのカスタマイズなどが行えます。プラグインのアップロードは “監視コマンド一覧” をクリックします。

check_multi_command_list

check_multi のアップロードを行うので、[ 登録 ] ボタンをクリックし、アップロード画面へ遷移後、check_multi を選択し [ 登録と承認 ] ボタンをクリックします。

check_multi_new_upload check_multi_upload_register

これで check_multi のアップロードは完了です。

check_multi_upload_ref

14.3.2. サービス監視用コマンドの追加

監視プラグイン check_multi をX-MONへアップロードするだけでは、まだ利用できません。サービス監視として利用できるように設定していきます。

“独自プラグイン管理” 画面より “監視プラグイン設定” を選択します。

check_multi_plugin_setting

新規登録を行う場合、[ 登録 ] ボタンをクリックします。

check_multi_plugin_add

監視プラグインの設定画面へ遷移した後、以下の項目に情報を入力した後、[ 詳細な設定へ進む ] をクリックします。

check_multi_plugin_input

項目名

内容

コマンド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の再起動を行えば完了です。

check_multi_service_create

うまく監視が始まると、ステータス情報内に各監視結果を表示します。

check_multi_kanshi_status

14.4. check_multi で利用する ***.cmd ファイルの記載方法について

cmdファイル内で利用できる定義のうち、利用頻度の高い3つの定義を紹介します。

  • eeval

  • command

  • state

14.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$

14.4.2. command

実行する監視を指定します。

command [ 任意の名称 ] = 実行内容

  • 任意の名称にはA-Za-z0-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_multi_setting_menu

例) FTP監視を行う場合

command [ ftp ] = check_ftp -H $HOSTADDRESS$ -t $ARG1$ -p $ARG2$

$ARG1$は引数1項目を確認し “タイムアウト(秒)”、$ARG2$はポート番号を “監視プラグイン設定” より指定します。

14.4.3. state

必須定義ではありません。

stateを定義しない場合、command定義のうちOKステータスではないステータスを探し、最高重症度のステータスを返します。

評価順序は次の通りです。

重症度

ステータス

↑重症

CRITICAL

WARNING

↓軽症

UNKNOWN

OK

state [ OK | UNKNOWN | WARNING | CRITICAL ] = 判定内容

stateの定義方法は複数存在します。

  1. ステータス状態数をカウントする

以下の例は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
  1. コマンド毎にステータスを判定する

以下の例はping監視がOK以外のステータスを返す場合、CRITICALと判定します。

command [***] で定義した任意の名称を利用し $STATE_(任意の名称)$ と記載すると、ステータス状態を利用できます。また$OK、$WARNINGなど各ステータス名前に$を付けることで判定に利用できます。

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
  1. 正規表現で判定する

以下の例は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の演算子は許可されているので組み合わせることで柔軟な判定を設定することが可能です。

14.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$

check_multi_service_cmd

check_multi_service_kanshi

また、逆にすべての引数を変更する必要がない場合などは ***.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

監視内容や利用用途に合わせ、スタイルを変更すると使い勝手も良くなります。

14.6. 複数条件監視対応表

check_multi_support