Nagiosに用意された外部コマンドの使用法
システム監視ツールのNagiosには、コマンドやイベントを外部アプリケーションから受け取る強力な機能が装備されている。通常こうした外部コマンドの送信元となるのは、イベントハンドラないしNagiosのWebインタフェースである。外部コマンドが最も役立つ状況としては、各自のシステムで用いるハンドラを作成する場合や、Nagiosと情報交換をさせる外部アプリケーションを構築する場合を想定すればいい。
本稿はPackt Publishingより最近出版された『Learning Nagios 3.0』からの抜粋である。
外部コマンドパイプとは、Nagiosがメッセージの受信に使用するファイルシステム上に作成されたパイプファイルのことである。ここでの通信には特別な認証や権限は必要なく、唯一課される要件は、コンパイル時のlocalstatedirオプションにて指定されたディレクトリにあるパイプファイルrw/nagios.cmdへの書き込み権限を有していることだけだ。
一般に外部コマンドファイルへの書き込み権限は、所有者およびnagioscmdで使用される通常のグループに対して与えられている。Nagiosデーモンへのコマンド送信を許可したいユーザについては、このグループへの追加登録だけをしておけばいい。
コマンドパイプには、結果を返す機能が用意されていないという欠点が存在する。これは致命的な不備ではないものの、Nagiosに対してquery系のコマンドを送信することはできない。つまりコマンドパイプによる操作だけでは、Nagiosに渡したコマンドが既に処理済みであるのか、すぐに処理されるのかといった情報を確認できないのだ。ただし、Nagiosのログファイルを読み取ることはできるので、その情報を基にすれば、渡したコマンドが正常に解析されていたかを確認することはできる。
Webインタフェースを介したNagiosの制御は、外部コマンドパイプを用いて行うようになっている。Webインタフェースから行うNagiosへのコマンド送信や設定変更に、その他の機構が介在することはない。
Nagiosデーモンからは、どのユーザが何の操作を実施可能かを明確に区別することはできない。よって、リモートユーザによる外部コマンドパイプを用いたコマンド送信を実装する場合は、権限を有さないユーザによるNagiosへの危険なコマンド送信を防止する認証機構を設けておく必要がある。
コマンドに用いる構文は単純なものである。基本的な構文は下記のように定められているが、各コマンドは1つの行として記述する必要があり、その末尾は改行記号で終えなくてはならない。
[TIMESTAMP] COMMAND_NAME;argument1;argument2;...;argumentN
ここでTIMESTAMPには、Unix時刻での指定を行う。つまり1970年01月01日の00時00分00秒からの経過時間を秒に換算した値を求めなくてはならないが、この種の計算はdateコマンドにて行えるはずだ。またプログラミング言語の中には、現在のUnix時刻を取得する機能が設けられているものが多い。
コマンド名はすべて大文字で記述するよう定められている。指定可能な引数は個々のコマンドごとに異なり、例えば下記のサンプルは、セキュリティ監査に合格した旨のコメントをホストに追加するシェルコマンドである。
echo "['date +%s'] ADD_HOST_COMMENT;somehost;1;Security Audit; This host has passed security audit on 'date +%Y-%m-%d'" >/var/nagios/rw/nagios.cmd
実際にこれを実行すると、外部コマンドパイプを介して1つのADD_HOST_COMMENTコマンドがNagiosに送信される。その後Nagiosはこのコメントをsomehostというホストに追加し、その際には当該コメントの発信元は「Security Audit」であるという通知も行う。つまり、このコマンドの1番目の引数はコメントの追加先とするホスト名の指定、2番目の引数は当該コメントを永続化させるかどうかのNagiosに対する指定、3番目の引数はコメントの発信元を示す指定、4番目の引数はコメント本体となるテキストとなっているのだ。
サービスを対象としたコメントの追加でも同様のADD_SVC_COMMENTコマンドを使用する。このコマンドの構文はADD_HOST_COMMENTのものとほぼ共通しているが、この場合はホスト名だけでなくサービス名も指定しなくてはならない。
こうしたコメントを個別または一括して削除するには、DEL_HOST_ COMMENT、DEL_ALL_HOST_COMMENTS、DEL_SVC_COMMENT、DEL_ALL_SVC_COMMENTS というコマンドを使用する。
その他に言及しておくべきものとして、チェックのスケジュール指定と強制実行に関連したコマンド群が存在する。可及的速やかなチェックを要求する具体的なケースとしては、特定ソリューションに対する試験を施す場合などを想定すればいいだろう。
下記のサンプルコードは、指定した1つのホスト、そのホストにおける全サービス、最初のものとは異なるホストにおけるサービスの1つに対し、それぞれのチェックスケジュールを指定するスクリプトである。
#!/bin/sh NOW='date +%s' echo "[$NOW] SCHEDULE_HOST_CHECK;somehost;$NOW" \ >/var/nagios/rw/nagios.cmd echo "[$NOW] SCHEDULE_HOST_SVC_CHECKS;somehost;$NOW" \ >/var/nagios/rw/nagios.cmd echo "[$NOW] SCHEDULE_SVC_CHECK;otherhost;Service Name;$NOW" \ >/var/nagios/rw/nagios.cmd exit 0
ここで用いたコマンドのうちSCHEDULE_HOST_CHECKとSCHEDULE_HOST_SVC_CHECKSでは、スケジュールする時刻およびチェック対象となるホスト名を指定する。これに対してSCHEDULE_SVC_CHECKコマンドのチェック対象指定としては、ホスト名だけでなくサービスも特定しなくてはならない。
このサンプルにて用いたような通常タイプのスケジュール指定でのチェックは、指定の時刻通りに実行されない可能性がある。つまりNagiosは、スケジュール指定された時刻だけを基に判断するのではなく、Nagiosの全体ないし特定のオブジェクトに対してチェックを無効化する指定が施されていないかという要件も考慮するのだ。
こうしたチェックをNagiosに強制実行させたい場合は、SCHEDULE_FORCED_HOST_CHECK、SCHEDULE_FORCED_HOST_SVC_CHECKS、SCHEDULE_FORCED_SVC_CHECKというコマンドを使用すればいい。これらの強制コマンドについては、Nagiosによる指定時刻の検証および対象となるオブジェクトがチェック可能かの確認がスキップされるだけで、実行されるチェックそのものに変化はない。いずれにせよこれらを使えば、Nagiosに関するその他のパラメータ設定に影響されることなく、確実にチェックを実行できるのである。
その他の有用な機能としては、Nagios 3にて追加されたカスタム変数関連のコマンド群がある。これは、ホスト、サービス、コンタクトに関するカスタム変数を定義しておくことで、外部コマンドパイプを介して当該ファイルにおける値を変更可能にするというものだ。
こうした変数はチェックおよび通知用のコマンドやイベントハンドラから直接使用できるため、これらの属性を扱う他のアプリケーションやイベントハンドラは、設定ファイルでの変更を介さずにその値を直接操作することができる。
それでは、こうした機能は具体的にどう使用するのだろうか? 例えばGUIを介さないタイプのアプリケーションを介して、オフィスにおける特定ITスタッフの所在を登録する機構が存在するとしよう。そして各スタッフのオフィス在席情報として、このアプリケーションに通知されたIPアドレスの最新情報がNagiosに定期送信されるようになっていれば、通知用のコマンドにこの情報を渡すことで、当該ユーザへのメッセージ送信用IPアドレスとして利用できるはずである。
例えばユーザ名がjdoeでカスタム変数名がDESKTOPIPだとすると、Nagiosの外部コマンドパイプに送信すべきメッセージは下記のようになる。
[1206096000] CHANGE_CUSTOM_CONTACT_VAR;jdoe;DESKTOPIP;12.34.56.78
実際にこれを実行した後に$_CONTACTDESKTOPIP$を使用すると、12.34.56.78という値が返されるはずである。
コンタクト、ホスト、サービスのカスタム変数を変更するには、Nagiosに用意されているCHANGE_CUSTOM_CONTACT_VAR、CHANGE_CUSTOM_HOST_VAR、CHANGE_CUSTOM_SVC_VARというコマンドを使用すればいい。
本稿で解説したコマンドは、Nagiosの外部コマンドパイプに装備されている機能のごく一部を取り上げただけに過ぎない。使用可能な全コマンドの一覧については、「External Command List」のページにて確認できる。