CentOS 5.4 にサーバー監視ツール Nagios 3.2 をインストールする

SETUP

サーバー監視ツール Nagios 3.2 を CentOS 5.4 にインストールしてみました。

その設定方法についても簡単に記載しておきます。


サーバー監視ツール Nagios

Nagios とは、http://www.nagios.org/ で提供されている、サーバー監視ツールです。

これを利用することで、サーバーの状態を自動でモニタリングして、異常があれば管理者へメールで通知するといったことが可能となります。

 今回はこの Nagios を CentOS 5.4 にインストールしてみることにしました。なお、インストールには Nagios と併せて、その状態を閲覧するために Web サーバー Apache が必要となります。

CentOS で Apache を起動する方法については EZ-NET: Linux の使い方: Apache を起動する (CentOS 5.4) の方をご覧ください。

 

Nagios 3.2 のインストール

今回は CentOS 5.4 らしく yum を用いたインストールを行ってみようと思います。

そのためには、平成 22 年 3 月 16 日現在、yum リポジトリとして "rpmforge"を追加する必要があります。

リポジトリの追加方法については EZ-NET: Linux の使い方: CentOS 5.4 のシステムアップデート取得先としてリポジトリを追加する に記してありますので、必要に応じてこちらも参照してください。

Nagios 本体のインストール

"rpmforge" リポジトリが追加されていれば、次のようにして Nagios をインストールすることができます。

yum --enablerepo=rpmforge install nagios

これにより、平成 22 年 3 月 16 日の時点では "Nagios 3.2.0-1.el5.rf" というバージョンがインストールされました。

Nagios プラグインのインストール

また、サーバーの監視を行うためのツールセットである Nagios プラグインも併せてインストールする必要があります。

yum --enablerepo=rpmforge install nagios-plugins

こちらは、"1.4.13-1.el5.rf" というバージョンがインストールされました。

プラグインファイルは "/usr/lib64/nagios/plugins/" にインストールされています。32 ビット環境であれば "/usr/lib/nagios/plugins/" ディレクトリにインストールされているかもしれません。

 

Nagios 監視ページを Apache に組み込む

Nagios の監視状態を目で見るためには、Web サーバー Apache を設定する必要があります。

ここでは、既に Apache が起動しているものとして、それに Ngios 監視ページを追加するという方向で話を進めて行きます。CentOS で Apache を起動する方法については EZ-NET: Linux の使い方: Apache を起動する (CentOS 5.4) の方をご覧ください。

 

Nagios の Apache に関する設定ファイルは、Nagios インストール時に "/etc/httpd/conf.d/nagios.conf" として用意されています。

CentOS 5.4 であれば、この設定ファイルは Apache 起動時に自動的に読み込まれるようになっていますので、特に大きな調整は調整は必要ありません。ただし、第三者が勝手に閲覧するのを防ぐために認証設定がされているので、その辺りの調整が必要となります。

既定では "/nagios" ディレクトリへアクセスして、"/etc/nagios/htpasswd.users" を用いた Basic 認証を行うことで、監視ページを閲覧できるようになっています。

なお、登録されているディレクトリは、次のようなマッピングでした。

/nagios/cgi-bin /usr/lib64/nagios/cgi
/nagios /usr/share/nagios

 

今回は、Basic 認証ではなく、特定のネットワークからのみのアクセスを許可する設定にしたかったため、AuthName, AuthType, AuthUserFile, Require ディレクティブをコメントアウトして、次のような感じで制限をかけることにします。

Order deny,allow

Deny from all

Allow from 192.168.0.0/24

もし、Basic 認証による制限を行いたい場合には、"htpasswd /etc/nagios/htpasswd.users USERNAME" といった感じで USERNAME アカウントを作成して、認証を通過できるようにする感じです。

 

その他、設定を好みに合わせて調整したら、次のようにして Apache の設定を再読み込みすれば、Nagios 監視ページの設定が有効になります。

service httpd reload

Nagios をインストールしたばかりの場合、/nagios のトップページ以外を参照すると "Error: Could not read object configuration data!" といったメッセージが表示されることがあるかもしれません。

監視対象を登録すれば解消されるので、とりあえず Nagios のトップページが確認できれば大丈夫です。

 

Nagios 3.2 に監視対象を設定する

Nagios の設定は "/etc/nagios/objects" ディレクトリ内のファイルを編集することで行います。

たとえば、DNS サーバー "ns.xxxx.xx.xx" の監視設定は次のような感じになります。

ホストの登録

まず、"/etc/nagios/objects/localhost.cfg" を編集して、ホスト情報とそのグループ情報を登録します。

define host {

use    linux_server

host_name    SERVER1

address    192.168.0.1

}

最初の中括弧は define host の横に記載しないとエラーとなります。

また、ホスト情報を登録したら、それが参加するホストグループを登録しておきます。

define hostgroup {

hostgroup_name    SERVER_GROUP_A

alias    Server Group A

members    SERVER1

}

members として、定義済みの "host" 名を指定する必要があります。ここで存在しない名前 (大文字小文字の違いを含む) を指定するとエラーとなるので注意しましょう。

サービスの登録

ホスト情報を登録したら、監視するサービスの登録を行います。

こちらも既定では "/etc/nagios/objects/localhost.cfg" に設定するようになっていますので、このファイルを編集して登録を行うことにします。

define service {

use    generic-service

 

host_name    SERVER1

service_description    DNS

 

check_command    check-dns_resolvehost!www.yahoo.jp

check_period    24x7

 

notifications_enabled    1

 

notification_period    24x7

notification_options    w,u,c,r

notification_interval    20

max_check_attempts    3

 

normal_check_interval    1

retry_check_interval    1

 

contact_groups    admins

}

ここで、"check_command" で指定されている "check-dns_resolvehost" というのは、"command.cfg" で定義した監視用コマンドです。これについては、また下の方で説明します。

他、サービスの定義で指定している項目の意味は、下のような感じになっています。

check_period チェック期間を指定します。この範囲外では監視は行われません。指定できる名前は "timeperiod.cfg" で定義されている名前となります。
notifications_enabled エラー通知が有効であるか (1) 無効であるか (0) を指定します。
notification_period エラー通知を行う期間を指定します。この範囲外ではエラー発生を検出しても通知が行われなくなります。指定できる名前は "timeperiod.cfg" で定義されている名前となります。
notification_options WARNING (w) で通知するか、UNKNOWN (u) で通知するか、CRITICAL (c) で通知するか、OK 状態に復帰した場合 (r) に通知するか、通知しない (n) かを、括弧内に記した文字で指定します。複数指定する場合にはカンマで区切って指定します。
notification_interval エラー状態が改善されない場合に、再度通知を送信するタイミングを分単位で指定します。障害発生時の再通知が不要の場合には 0 を設定します。
max_check_attempts チェック結果が OK 以外となった場合に、ここで設定した回数だけ再チェックを試みます。ここで設定した回数を超えて OK 以外となった場合にエラー通知されます。
contact_groups エラー通知の通知先を指定します。指定できる名前は "contacts.cfg" で定義されている "contactgroup" の名前となります。複数指定する場合にはカンマで区切って指定します。
normal_check_interval OK の状態または、既に max_attempts を超えて監視が続けられている状態時の、再監視間隔を分単位で指定します。
retry_check_interval エラーが検出された際に、再チェックを行う間隔を分単位で指定します。

なお、上記では "分単位" と書いていますが、この単位は "nagios.cfg" の "interval_length" によって秒単位で設定することができるようです。

 

サービスについても、サービスグループの登録を行うことができるようになっています。

define servicegroup {

servicegroup_name    DNS

alias    DNS Services

 

members    SERVER1,DNS

members    SERVER2,DNS

}

サービスグループの登録の際は、"members" として、"ホスト名 (host_name)","サービス名 (service_description)" という形で指定します。複数のメンバーを登録する場合には、上記のように "members" を複数指定します。

 

監視コマンドの定義

さて、先ほどの監視するサービスの登録のところで使用した監視コマンドについてですが、必要な監視コマンドを "/etc/nagios/objects/commands.cfg" に登録しておく必要があります。

やり方としては、インストールしたプラグインを用いて監視コマンドを "command.cfg" に定義して、それをここで利用するといった形になります。例えば、先ほど指定した DNS サービス監視のためのコマンド定義は、ここでは次のような感じにしてあります。

define command {

command_name    check-dns_resolvehost

command_line    $USER1$/check_dns -H $ARG1$ -s $HOSTADDRESS$

}

$HOSTADDRESS$ というのは、監視するサービスを登録した際に、host_name で指定したホストのアドレスに置き換わる部分です。また、$ARG1$ というのは、今定義している監視コマンドを使用する際に指定された引数の 1 番目の値と置き換わることを意味します。

引数の指定は、監視するサービスを登録する際に、! 記号を使って "command_name!arg1!arg2" といった感じで指定します。

 

なお、プラグインの使用方法は、各プラグインに -v オプションを付けて実行すれば、確認することができるようになっていました。

例えば "check_http" の場合には、コマンドラインから "/usr/lib64/nagios/plugins/check_http -h" を実行すると、-H に続けてドメイン名を指定することや -u で URI を指定できるといった使い方を確認することができますので、これを参考にして監視コマンドの定義を行います。

 

設定内容を反映する

必要な監視設定を行ったら、次のようにして設定ファイルの記載に間違いがないかを確認します。

service nagios checkconfig

これで "OK" と帰ってくれば設定に間違いはありませんので、次のようにして、その設定を Nagios に反映させます。

service nagios reload

もし "CONFIG ERROR!" というメッセージが返ってくる場合には、設定内容に間違いがあることを示しているので、設定ファイルの内容を見直して正しく修正する必要があります。

ただ、それ以上の細かいエラー箇所の通知がないようなので、間違いを探すのはなかなか大変です。

よくある間違いとしては、ホストグループやサービスグループの定義で、定義されていないホスト名やサービス名が現れる場合 (大文字小文字の違いにも注意) や、監視するサービスの登録で、"contact_group" に指定されている名称が "contactgroup" で定義されていない、該当する監視コマンドが定義されていない、service_description に "(" や "-" といった文字を使用している、各定義の最初の中括弧か define が書かれた行と同じ行に書かれていないといったところでしょうか。

それ以外にも自分の場合、ちょっといじったら間違いになってしまい、その箇所が分からなくなるといったことが良くありましたので、慣れないうちは注意して少しずつ触っては試してみるのが良いかと思います。

 

さて、これでサーバーの監視が行えたかと思いますが、もしも Nagios 監視ページを見ても、次のようなエラーが発生してしまう場合には "/etc/nagios/cgi.cfg" の設定を確認します。

It appears as though you do not have permission to view information for any of the hosts you requested...

If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI

and check the authorization options in your CGI configuration file.

この場合、use_authentication=1 を 0 に変更することで、認証なく監視機能にアクセスすることが可能になるようです。

もっとも、このケースは、今回 Basic 認証ではなく Apache の "Allow from" ディレクティブによってアクセス制御を行っているためで、Basic 認証を行う場合などでは、続く authorized_for ... といった値のところに閲覧を許可する認証アカウント名を設定するのが正しいやり方のような感じです。

 

エラー通知がメールで送られてこない場合の確認事項

正しく設定しているはずなのに Nagios からエラー検出時の通知が送られてこない、または送られてこないことがある場合、次のようなことに注意して設定を再確認すると良いかもしれません。

エラー通知コマンドの確認

まず、Nagios がメールを送ることができるかどうかを確認します。

Nagios は、"commands.cfg" に定義されている "notify-host-by-email" コマンドや "notify-service-by-email" コマンドを用いて、エラー通知をメール送信しています。

実際、このコマンドは、"templates.cfg" の中の "contact" テンプレートの "service_notification_commands" と "host_notification_commands" の 2 箇所でそれぞれ指定されているのが見られます。

もし、登録してある "contact" 情報が使用しているテンプレートに意図せずこれらの指定が含まれない場合には、エラー通知送信用のコマンドが正しく設定されていない可能性があるかもしれません。

メール送信コマンドの確認

"contact" に対してエラー通知送信用のコマンドが正しく登録されていた場合、そこで使用している電子メール送信コマンドが正しく動作するか、試してみるもの良いかもしれません。

例えば、サービスのエラー通知の設定は、既定では次のようになっているようでした。

# 'notify-service-by-email' command definition

define command {

command_name notify-service-by-email

command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$

}

ここから読み解けることとしては、電子メールによる通知の際に "/bin/mail" コマンドを使用しているところです。

ですので、このコマンドが正しく動作するかを確認することで、電子メール自体が正しく送られるはずかどうか確認することができます。これには、次のようなコマンドを、コマンドラインから直接実行すれば良いかと思います。

echo "TEST" | /bin/mail -s "TEST" xxx@xxxx.xxx.xx

このようにして、テストメールが "xxx@xxxx.xxx.xx" 宛に届いたならば、電子メールの送信機能自体には大きな不具合はなさそうです。

監視期間と通知期間を確認する

電子メールが正しく送信できるはずなのにエラー通知が送信されない場合には、ホストやサービス毎に指定している監視期間や通知期間を再度確認してみると良いでしょう。

これはつまり、ホストやサービスで指定してる "check_period" や "notification_period" がそうなのですけど、これが "24x7" 以外に設定されている箇所がある場合、それらは場合によっては監視や警告をしない時間が含まれているかもしれません。

例えば特に注意したいのが、既定で用意されているホストテンプレート "linux-server" は、"notification_period" として "workhours" が設定されているようでした。これは "平日 9:00 から 17:00" を意味するようで、この範囲外でのエラー通知はされないという設定です。

しかもどうやら、ホストの方で通知をしない期間が設定されていた場合、サービスの方で "24x7" を指定していても、該当する非通知期間の間はエラー通知が送られてこないようなので、サービスの場合はホストの方の通知設定も含めて確認する必要がありそうです。

もう一つの "windows-server" というホストテンプレートでは "notification_period" が "24x7" に設定されているので、つい勘違いして見逃していないか確認すると良いでしょう。

同様に、通知するエラーを決める "notification_options" や、エラーの通知先を示す "contact_groups" といった辺りも気にしておきます。