はじめに

Nagiosで遠隔地にあるサーバの内部リソース を監視する方法として、NRPE(Nagios Remote Plugin Executer)とNSCA(Nagios Service Check Acceptor)がある。NRPEはNagios監視サーバから遠隔サーバに対してリクエストを投げ 、遠隔サーバでのプラグインの実行結果を取得するのに対し、NSCAでは、遠隔サーバ側から送られてくるプラグインの実行結果を受け取り 、状態を取得する。NCSAはもともとは分散監視用に提供されている機能であり、遠隔サーバからチェック結果の通知が来なくなった場合のエラー判定をどうするのかといった問題がある ため、遠隔サーバの監視にはNRPEを使った方が設定が楽だが、遠隔サーバとの間にファイアウォールがあって遠隔サーバへのアクセスが制限されていてNRPEが使えない場合に、その制限を回避するために使うことが出来る。

ここでは、NSCAを使って遠隔サーバの内部リソースの状態を監視するための方法を説明する。以下の説明では、次の2台のサーバを例として扱う。

監視サーバ(monitor) Nagiosが起動しているサーバ 遠隔サーバ(remote) 監視対象となるサーバ

また、以下の記述ではFreeBSDとPortsシステムを使うことを前提としているので、ファイルのパス等は自分で利用するOS等にあわせて読み替えて欲しい。

遠隔サーバでの設定

遠隔サーバには、NagiosとNSCAクライアント(send_nsca)を最低限インストールする必要がある。FreeBSDの場合net-mgmt/nagios, net-mgmt/nagios-*, およびnet-mgmt/nsca-clientというPortsがあるので、それを利用するとよい。

内部リソースの監視のために、まずは遠隔サーバのNagiosで通常の監視と同じ設定を行う。その際、CGIインターフェイスについては監視サーバのものを利用するので設定は不要。通常の監視と同じなので、具体的な設定方法については省略する。

監視に必要な設定

▼ Nagiosの設定

監視の設定が完了したら、/usr/local/etc/nagios/nagios.cfgを編集し、次の設定を確認(修正)する。

enable_notifications=0 メールによる通知を無効にする。通知は監視サーバ側で行うので、遠隔サーバでの通知は不要となる。 obsess_over_services=1 各サービスのチェックが終わった直後にocsp_commandオプションで指定されたコマンドを実行するための設定。 ocsp_command=submit_check_result 各サービスのチェックが終わった直後に実行するコマンド名。

▼ NSCAの設定

/usr/local/etc/nagios/send_nsca.cfgを編集し、NSCAの設定を行う。

password=[パスワード] encryption_method=3

passwordには、NSCAを使って通信する際のパスワードを入れる。人が覚える必要はないパスワードなので、長くてランダムな文字列を生成して入れるようにする。encryption_methodは通信で使う暗号化手法で、'3'はTriple DESになる。サンプル設定ファイルに数字と暗号化手法の対応があるので、適当に選んで設定すること。これらの設定は監視サーバのNSCAと同じにする必要がある。

ファイルの編集が終わったら、send_nsca.cfgの属性を変更する。パスワードや暗号化手法といった重要な情報が記載されているので、不必要なアカウントからは見えないようにする。

# chown nagios:nagios /usr/local/etc/nagios/send_nsca.cfg # chmod 440 /usr/local/etc/nagios/send_nsca.cfg

コマンド定義の記述

次に、ocsp_commandで指定したコマンドsubmit_check_result を/usr/local/etc/nagios/commands.cfg の中で定義する。以下の設定をそのまま使えばよい。

# for nsca client define command{ command_name submit_check_result command_line /usr/local/libexec/nagios/submit_check_result $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATEID$ '$SERVICEOUTPUT$' }

コマンドファイルの作成

さらに、command_lineで指定した/usr/local/libexec/nagios/submit_check_resultを作成する。central_serverに監視サーバのホスト名を入れれば、そのまま使える。

#!/bin/sh central_server="monitor" # Arguments: # $1 = host_name (Short name of host that the service is # associated with) # $2 = svc_description (Description of the service) # $3 = state_string (A string representing the status of # the given service - "OK", "WARNING", "CRITICAL" # or "UNKNOWN") # $4 = plugin_output (A text string that should be used # as the plugin output for the service checks) # # Convert the state string to the corresponding return code return_code=-1 case "$3" in OK) return_code=0 ;; WARNING) return_code=1 ;; CRITICAL) return_code=2 ;; UNKNOWN) return_code=-1 ;; [0-2]) return_code=$3 ;; esac # pipe the service check info into the send_nsca program, which # in turn transmits the data to the nsca daemon on the central # monitoring server /usr/bin/printf "%s\t%s\t%s\t%s

" "$1" "$2" "$return_code" "$4" | /usr/local/sbin/send_nsca $central_server -c /usr/local/etc/nagios/send_nsca.cfg

Nagios不要? このsubmit_check_resultを使って % submit_check_result remote 'sample service' 0 'OK - sample service' のようにコマンドを直接実行すればNagiosいらないんじゃね？と思ったあなた。正解です。ただし、そうした監視体制を整えるにはcronによる定期的なチェックなどの設定が必要になりますので、個人的にはNagiosのプラグインを書いてしまう方法をおすすめします。

ファイルを作成したら、属性を正しく設定する。誰でも実行可能にすると、遠隔サーバのローカルユーザから監視サーバにいたずらできてしまうので、遠隔サーバ上でNagiosを起動するユーザ(nagios)の所有とし、othersへの実行許可ビットは落とすこと。

# chown nagios:nagios /usr/local/libexec/nagios/submit_check_result # chmod 750 /usr/local/libexec/nagios/submit_check_result

以上で遠隔サーバでの設定は完了となる。

監視サーバでの設定

監視サーバには、NagiosとNSCAサーバ(nsca)をインストールする必要がある。FreeBSDの場合net-mgmt/nagios, net-mgmt/nagios-*, およびnet-mgmt/nscaというPortsがあるので、それを利用するとよい。

監視に必要な設定

▼ Nagiosの設定

/usr/local/etc/nagios/nagios.cfgを編集し、次の設定を確認(修正)する。

enable_notifications=1 メールによる通知を有効にする。異常が発見された場合の通知は全て監視サーバで行う。 execute_service_checks=<0/1> もし監視サーバ側でNSCAによる受動的な監視以外の監視活動を行う場合は1、全ての監視結果をNSCA経由で受け取る場合は0にする。 check_external_commands=1 外部コマンドのチェックを有効にする。NagiosとNSCAは外部コマンドを通じて状態を取得する。 command_file=/var/run/nsca/spool/nagios.cmd 外部コマンドのパス。後述するnsca.cfgの"nsca_chroot + command_file"と一致する値にする。

▼ NSCAの設定

NSCAは設定によりchrootした環境下で動かすことが可能になるので、ここではその機能を利用した設定を説明する。さらにFreeBSDのPortsバージョンでは、標準でTCP wrapperによるアクセス制限もできるので、これも後ほど設定する。

/usr/local/etc/nagios/nsca.cfgを編集し、NSCAの設定を行う。

nsca_chroot=/var/run/nsca command_file=/spool/nagios.cmd alternate_dump_file=/spool/nsca.dump password=[パスワード] encryption_method=3

nsca_chroot=/var/run/nsca NSCAデーモンが起動時にchrootするディレクトリ。 command_file=/spool/nagios.cmd Nagiosのコマンドファイルのパス。実際のファイルのパスはnsca_chrootからの相対パスになる。 alternate_dump_file=/spool/nsca.dump コマンドファイルが見つからない場合の監視データの保存先。 password=[パスワード] NSCA通信用パスワード。遠隔サーバとあわせる。 encryption_method=3 NSCA通信暗号化手法。遠隔サーバとあわせる。

設定ファイルの編集が終わったら、遠隔サーバと同様にファイルの属性を修正する。

# chown nagios:nagios /usr/local/etc/nagios/nsca.cfg # chmod 400 /usr/local/etc/nagios/nsca.cfg

NSCAのchroot環境の準備

NSCAデーモンがchrootして実行される環境を準備する。

# mkdir -p /var/run/nsca/spool # chown -R nagios:nagios /var/run/nsca # mkdir /var/run/nsca/etc

/var/run/nsca/etc/hosts.allowを作成し、ホストベースでのアクセス制限を設定する。

nsca : remote : allow nsca : ALL : deny ALL : ALL : deny

1行目が遠隔サーバからのアクセス許可。"remote"の部分をアクセス許可したいホストやネットワークの記述に書き換える。2行目でそれ以外の前ホストからのアクセスを拒否。3行目はその他の全てのサービスについて、全ホストからのアクセスを拒否。このファイルはNSCA以外のサービスでは利用されないので、本来は不要。

サービス定義の記述

監視サーバで遠隔サーバから受け取った結果を監視するには、監視サーバ側でもサービスの定義を記述する必要がある。

まず、サービスの定義が最低限ですむように雛形となるサービスの定義を記述する。

define service{ name generic-passive use generic-service active_checks_enabled 0 check_freshness 1 freshness_threshold 600 check_command service-is-stale register 0 }

active_checks_enabled 0 このサービスではアクティブチェックを無効にする。つまり、check_commandによるチェックは行わない。 check_freshness 1 鮮度チェック。一定時間遠隔サーバからの情報更新が無かった場合に警告が出るようにする。 freshness_threshold 600 鮮度チェックのしきい値(秒)。10分間遠隔サーバから通知が無かったら期限切れとして、check_commandを実行する。 check_command service-is-stale 期限切れになった場合にのみservice-is-staleコマンドを実行する。

この定義の記述にある鮮度チェック関連の設定により、遠隔サーバからの通知が来なくなった場合の問題はある程度解決する。

次に、実際に監視するサービスの定義を記述する。

define service{ use generic-passive host_name remote service_description Current Load }

host_name, service_descriptionの名前は遠隔サーバ上での定義とあわせる必要がある。

コマンドの定義

service-is-staleコマンドの定義を記述する。

define command{ command_name service-is-stale command_line $USER1$/check_dummy 2 'CRITICAL: Service results are stale!' }

動作確認

設定が全て終わったら動作確認を行う。

デバッグの準備

NSCAのデバッグ設定 /usr/local/etc/nagios/nsca.cfgを編集して「debug=1」に変更する。通知内容が記録されたり、ログが肥大化したりするので、テストが終わったら必ず0に戻す。 /etc/syslog.confの設定 NSCAのログが/var/log/nsca.logに記録されるよう、/etc/syslog.confを修正

!nsca *.* /var/log/nsca.log

syslogdで再読み込み

# touch /var/log/nsca.log # /etc/rc.d/syslogd reload

/etc/rc.confを編集してNSCAを有効化

nsca_enable="YES"

Nagios(再)起動 Nagiosが起動時にコマンドファイルを生成するので、必ず先に(再)起動する。

# /usr/local/etc/rc.d/nagios (re)start

NSCA起動

# /usr/local/etc/rc.d/nsca start

NSCAの通信テスト

遠隔サーバでsubmit_check_resultコマンドを実行してテスト

# /usr/local/libexec/nagios/submit_check_result remote 'service name' 0 'OK test' 1 data packet(s) sent to host successfully.

監視サーバ側のログをチェック

Jan 1 00:00:00 monitor nsca[xxxxx]: Connection from <remote IP> port ##### Jan 1 00:00:00 monitor nsca[xxxxx]: Handling the connection... Jan 1 00:00:00 monitor nsca[xxxxx]: SERVICE CHECK -> Host Name: 'remote', Service Description: 'service name', Return Code: '0', Output: 'OK test' Jan 1 00:00:00 monitor nsca[xxxxx]: End of connection...

Nagiosによる監視テスト

監視サーバと遠隔サーバでNagios, NSCAを再起動し、監視サーバに正しく表示されれば完了。下のサンプル画像では遠隔サーバのロードアベレージ、ディスク使用量、RAIDディスクの状態などを監視しており、サービス名の右にある「PASV」というアイコンがNSCAによるパッシブチェックであることを示している。

参考文献

Nagios Version 2.x Documentation : http://nagios.sourceforge.net/docs/2_0/

同日本語訳：http://nagios-jp.sourceforge.jp/nagios-doc-2x-ja/