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によるパッシブチェックであることを示している。

nsca.jpg

参考文献

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

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


コメント:
Name: Comment:
Last modified:2011/10/20 21:55:52
Keyword(s):
References:[雑記録] [Nagios NSCA PNP] [SideMenu]

*1 ログインユーザ数とかCPU Loadとか、メモリ使用量とか、RAIDの状態とかのネットワークポート経由で監視できないリソース。SNMPを使う方法もあるが、本題と外れるので本稿では触れない。

*2 監視サーバ側がクライアントになる

*3 監視サーバ側がサーバになる

*4 後述する"freshness check"により解決する