Nagios NSCAによる遠隔サーバの内部リソース監視
Nagios NSCAによる遠隔サーバの内部リソース監視
はじめに
Nagiosで遠隔地にあるサーバの内部リソース*1を監視する方法として、NRPE(Nagios Remote Plugin Executer)とNSCA(Nagios Service Check Acceptor)がある。NRPEはNagios監視サーバから遠隔サーバに対してリクエストを投げ*2、遠隔サーバでのプラグインの実行結果を取得するのに対し、NSCAでは、遠隔サーバ側から送られてくるプラグインの実行結果を受け取り*3、状態を取得する。NCSAはもともとは分散監視用に提供されている機能であり、遠隔サーバからチェック結果の通知が来なくなった場合のエラー判定をどうするのかといった問題がある*4ため、遠隔サーバの監視には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\n" "$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/
- コメント:
Keyword(s):
References:[雑記録] [Nagios NSCA PNP] [SideMenu]