17. 複数条件監視(check_multi)

17.1. check_multi について

check_multi はサードパーティ製の Nagios Plugin です。オープンソースソフトウェアとして公開されております。

https://github.com/flackem/check_multi

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

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

check_multi_sample

Web サービス (Apache 等) が落ちた際に大量に障害が上がることを抑制できます。

check_multi_sample_http

なお、本記事は 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$

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

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

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_advanced_settings

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

check_multi_command_list

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

check_multi_new_upload check_multi_upload_register

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

check_multi_upload_ref

17.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

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 コマンドの「コマンドライン」行を利用します。

check_multi_setting_menu

例) 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 の定義方法は複数存在します。

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

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

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$

設定画面での表示

check_multi_service_cmd

ここでは、パラメタを引数の項目名、およびデフォルト名を下記のように設定しました。

項目名

デフォルト値

ping ラウンドトリップタイム WARNING しきい値 (平均 ms)

300

ping パケットロス率 WARNING しきい値 (%)

30

ping ラウンドトリップタイム CRITICAL しきい値 (平均 ms)

500

ping パケットロス率 CRITICAL しきい値 (%)

50

ping 送信回数 (回)

5

ping タイムアウト (秒)

10

ssh ポート番号

22

ssh タイムアウト (秒)

10

設定画面上の表示

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

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