前回は、Webサーバの監視ツールの選定と実際のインストール作業について解説しました。今回は、Nagiosのコンフィグファイルの設定について、もう少し踏み込んだ解説をしながら、ICMPによる監視について紹介します。(編集局)
Nagiosによる監視の設定は、コンフィグファイルに必要な設定を記述する方式である。ところが、前回の記事(Webサーバの監視?監視ツールの導入)の掲載後に寄せられた質問の中には、このコンフィグの設定に戸惑われている方が多かった。そこで、今回はNagiosのコンフィグファイルについて、もう少し踏み込んだ解説をしたうえで、最も基本的なICMP(ping)による監視を実現するところまでを解説することにした。
Nagiosには複数のコンフィグファイルがある。Nagiosのコンフィグファイル群は、大きく次の5種類に分けられる。
(1)メインコンフィグファイル
(2)リソースファイル
(3)オブジェクトコンフィグファイル
(4)CGIコンフィグファイル
(5)拡張コンフィグファイル
コンフィグファイルのサンプルは、Nagiosをインストールしたディレクトリ配下の/etcディレクトリ(標準は/usr/local/nagios/etc)に保存されている。これらのサンプルファイルを利用して、必要な部分だけを変更するようにしよう。
●メインコンフィグファイル(nagios.cfg)
Nagios実行時に参照されるメインのコンフィグファイルで、Nagiosの実行に必要な環境を設定する。Nagiosの実行モジュール、CGIはともにこのファイルを参照する。また、ほかに使用するコンフィグファイルがある場合には、この「nagios.cfg」内に定義しなければならない。
メインコンフィグファイルには非常に多くの設定項目があるが、多くはデフォルトの設定のままで利用できる。監視を設定する場合に、注意して確認しなければならない項目には、ログファイル、コンフィグファイルなどの監視結果や実行時のエラーが出力されるファイルと、監視を実行するユーザーなどの指定個所。各設定項目には英語でコメントが記述されているので、変更する前に確認すること。
# LOG FILE
Nagiosが実行されている間のイベントをロギングするファイルをここで指定する。デフォルトは「/usr/local/nagios/var/nagios.log」である。フルパスでファイル名を指定することで、任意のファイルへログを出力する
(例)
log_file=/usr/local/nagios/var/nagios.log
# OBJECT CONFIGRATION FILE(S)
監視対象の情報を保管するファイルのパスを指定する。標準で/usr/local/nagios/etc/以下のディレクトリに格納されるコンフィグファイル群(拡張子がcfgのファイル)のすべてのパスが記述されていることを確認しよう
(例)
cfg_file=/usr/local/nagios/etc/hosts.cfg
cfg_file=/usr/local/nagios/etc/checkcommands.cfg
# RESOURCE FILE
プラグインをインストールしているディレクトリへのパスを指定する
(例)
resource_file=/usr/local/nagios/etc/resource.cfg
# STATUS FILE
すべての監視対象のステータスを記録するファイルを指定する。Nagiosを起動するたびにこのファイルの内容はクリアされるので、ファイルの参照には注意が必要だ
(例)
status_file=/usr/local/nagios/var/status.log
# NAGIOS USER
# NAGIOS GROUP
Nagiosを実行するときのユーザ名およびグループ名を指定する。ユーザ名、グループ名の文字列もしくはUID、GIDのいずれかで指定する
(例)
nagios_user=nagios
nagios_group=nagios
# LOG ROTATION METHOD
ログローテーションの方法を指定する。毎時間、毎日、毎週、毎月、およびローテーションしないの5種類のうちいずれかを指定する
(例)
log_rotation_method=d
# LOG ARCHIVE PATH
ログローテーションによりアーカイブしたファイルを保管するディレクトリを指定する
(例)
log_archive_path=/usr/local/nagios/var/archives
# TIMEOUT VALUES
Nagiosが実行するコマンドのタイムアウト値を秒単位で指定する
(例)
service_check_timeout=60
host_check_timeout=30
# INTERVAL LENGTH
監視間隔を秒単位で指定する。標準は60秒
(例)
interval_length=60
ここまでの設定はnagios.cfgの一例である。ICMPによる疎通監視程度であれば、この程度の設定項目を確認すれば十分だろう。しかし、設定可能なオプションには、監視中のflapping(疎通が取れたり取れなかったりする現象)を認知するか、認知させる場合のしきい値はどうするかなどといった項目も設定できる。より細かい設定をしたい場合には、Nagiosのドキュメントを参照してほしい。
●リソースファイル(resource.cfg)
情報を保管するためのファイルで、ユーザ作成のマクロの定義や、データベースとの接続に必要な情報を設定するために使用する。
●オブジェクトコンフィグファイル
オブジェクトコンフィグファイルは、次のような複数のファイルから形成される。
hosts.cfg
hostgroups.cfg
services.cfg
checkcommands.cfg
contacts.cfg
contactgroups.cfg
dependencies.cfg
escalations.cfg
misccommands.cfg
timeperiods.cfg
これらのファイルに監視対象のホスト情報、サービス、通知先、実行コマンド等を定義する。Nagiosへの監視設定は、主にこれらのコンフィグファイルに記述する。
多くのオブジェクトコンフィグファイルは、共通設定のテンプレートと、それを補完する個別設定という2重構造になっている。最初にファイル全体へ有効となるパラメータ設定をテンプレートとして定義し、その後に個別の設定を記述する構成になっている。テンプレートで定義したパラメータの設定値は個別設定の定義の中に継承できるので、これらの設定値を有効に活用すると設定が楽になる。
・hosts.cfg
監視対象機器の情報を指定する。
(テンプレートの記述)
ファイル全体で共通な(もしくはたいていの監視対象で共通に使うと思われる)パラメータを記述したテンプレートで、define host{ }で囲まれた範囲にパラメータと設定値を記述する。ここで記述されたパラメータは、オブジェクトに定義された名前で識別できる。後に記述される各監視対象の設定では、このテンプレートに定義された名前を指定することで、テンプレートで記述したパラメータを各監視対象で継承することができる。
オブジェクトパラメータファイルの2重構造がわかりにくいことも考えられるので、記述例を以下に示す。この例ではテンプレートとして設定するオブジェクトの名前を「name」という名前で定義する。このname内で記述したパラメータは、各監視対象用のオブジェクトで“use”パラメータにより値を継承できる。なるべく監視対象全体に共通するパラメータを選んで定義し、各監視項目向けのオブジェクトで有効活用できるようにしたい。
また、register パラメータは標準で“1”が設定され、Nagiosプログラムがそのオブジェクトが実行されるべきオブジェクトであると認識する。設定したオブジェクトをテンプレートとして使いたいときは、register
パラメータに“0”を明示的に設定する必要がある。
【例】
# Generic host definition template define host{ name generic-host ; The name of this host template - referenced in other host definitions, used for template recursion/resolution notifications_enabled 1 ; Host notifications are enabled event_handler_enabled 1 ; Host event handler is enabled flap_detection_enabled 1 ; Flap detection is enabled process_perf_data 1 ; Process performance data retain_status_information 1 ; Retain status information across program restarts retain_nonstatus_information 1 ; Retain non-status information across program restarts register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE! }
・各監視対象の情報設定
監視対象機器のホスト名、監視対象機器の説明、IPアドレス、監視に使用するコマンド、監視時のステータス確認実施回数、アラートに関する設定などを記述する。テンプレートで指定されているパラメータとこの個別の監視対象機器のパラメータが重複して指定された場合、個別の監視対象機器の定義の方が有効となる。
【例】
# 'hoge' host definition define host{ use generic-host ; Name of host template to use host_name hoge alias Test Server #1 address xxx.xxx.xxx.xxx check_command check-host-alive }
・hostgroups.cfg
hosts.cfgで設定した各監視対象をグループとして定義したものである。アラートの通知先が同じ監視対象機器を1つのグループとしてまとめて記述するファイルと考えるとわかりやすい。
・services.cfg
各監視対象機器に、どのような監視を実行するのかを指定する。
・checkcommands.cfg
Nagiosが監視対象に対して実行するコマンドを定義する。Nagiosをインストールした状態で実装されているコマンドは、監視に必要なコマンドの大多数を網羅しているため、hosts.cfgファイルもしくはservices.cfgファイルで指定しているcheck_commandパラメータには、このファイルから必要な任意のコマンドを指定するだけで十分だろう。
・contacts.cfg、contactgroups.cfg
Nagiosが障害を検知した場合に、アラートを通知する先を指定する。
・escalations.cfg
障害時に通知する先が、contactgroups.cfgで設定したどの通知先グループに属しているかを指定する。
・misccommands.cfg
アラート通知用のコマンドを指定する。command_nameで設定したパラメータ値は、contacts.cfgファイル内のservice_notification_commands、host_notification_commands で指定する。
・timeperiods.cfg
監視する時間帯を指定する。
●CGIコンフィグファイル(cgi.cfg)
「cgi.cfg」は、CGI関連の設定を記述するコンフィグファイルである。
●拡張コンフィグファイル
CGIで使われるホストおよびサービスに対する付加情報を定義するために使用するコンフィグファイル。アイコンの定義等に使う。
※ここでは言及しないが、NagiosのWebインタフェースを利用するには、Nagiosのコンフィグファイル以外にWebサーバプログラム(apacheなど)のコンフィグファイルの修正も必要である。CGIとHTMLファイルへのアクセスが可能になるよう、使用しているWebサーバプログラムごとに設定してほしい。
実際にコンフィグファイルのパラメータの意味合いに注意しながら、システム監視の基本であるICMPによる疎通確認を定期的に実行するように設定してみよう。設定する監視対象の情報は次のとおり。
監視対象機器名 | www.yahoo.co.jp |
---|---|
監視項目 | ICMP(ping)による疎通監視 |
監視間隔 | 1分 |
異常と判断する条件 | 5分間、pingによる応答が連続してないこと |
通知先 | user@domain.com |
●hosts.cfgの設定
hosts.cfgには、監視対象機器のホスト設定を記述する。テンプレートとしてのオブジェクトは、デフォルトのまま。
# Generic host definition template define host{ name generic-host ; The name of this host template - referenced in other host definitions, used for template recursion/resolution notifications_enabled 1 ; Host notifications are enabled event_handler_enabled 1 ; Host event handler is enabled flap_detection_enabled 1 ; Flap detection is enabled process_perf_data 1 ; Process performance data retain_status_information 1 ; Retain status information across program restarts retain_nonstatus_information 1 ; Retain non-status information across program restarts register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE! }
個別の監視対象機器の設定は次のとおり。テンプレートの設定を継承し、ホスト名、IPアドレス、実行するコマンド、監視対象が完全にダウンしていると認知するまでの値、アラート通知に関連する設定(再連絡までの時間、通知の時間帯、通知内容)を設定する。
# 'speech' host definition define host{ use generic-host ; Name of host template to use host_name www.yahoo.co.jp alias Yahoo Server #1 address www.yahoo.co.jp check_command check-host-alive max_check_attempts 5 notification_interval 0 notification_period 24x7 notification_options d,u,r }
●hostsgroups.cfg
hostsgroups.cfgには、監視対象のホストのグループを設定する。監視対象のwww.yahoo.co.jpは、test-serversというホストグループに属し、通知先のグループにtest-adminsを設定する。
# 'test' host group definition define hostgroup{ hostgroup_name test-servers alias Test Servers contact_groups test-admins members www.yahoo.co.jp }
●escalations.cfg
escalations.cfgには、アラートの通知方法を設定する。次の例では、5回目、6回目のping疎通不可で、contact_groupsへ通知をするように設定している。
# Serviceescalation definition define serviceescalation{ host_name www.yahoo.co.jp service_description PING first_notification 5 last_notification 6 contact_groups test-admins notification_interval 0 }
●services.cfg
services.cfgには、各監視対象機器にどのような監視を実行するのかを指定する。hosts.cfgと同様、まずテンプレートオブジェクトを定義するが、今回は標準のまま利用することにした。
# Generic service definition template define service{ name generic-service ; The 'name' of this service template, referenced in other service definitions active_checks_enabled 1 ; Active service checks are enabled passive_checks_enabled 1 ; Passive service checks are enabled/accepted parallelize_check 1 ; Active service checks should be parallelized (disabling this can lead to major performance problems) obsess_over_service 1 ; We should obsess over this service (if necessary) check_freshness 0 ; Default is to NOT check service 'freshness' notifications_enabled 1 ; Service notifications are enabled event_handler_enabled 1 ; Service event handler is enabled flap_detection_enabled 1 ; Flap detection is enabled process_perf_data 1 ; Process performance data retain_status_information 1 ; Retain status information across program restarts retain_nonstatus_information 1 ; Retain non-status information across program restarts register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE! }
次に、今回の監視対象、www.yahoo.co.jpを個別の監視対象機器として定義する。テンプレートの設定を継承し、ホスト名、監視対象が完全にダウンしていると認知するまでの回数、正常であることを認知する回数、検知した異常を確認する回数、通知グループ、アラート通知に関連する設定(再連絡までの時間、通知の時間帯、通知内容)、実行コマンドを設定する。
# Service definition define service{ use generic-service ; Name of service template to use host_name www.yahoo.co.jp service_description PING is_volatile 0 check_period 24x7 max_check_attempts 5 normal_check_interval 5 retry_check_interval 1 contact_groups test-admins notification_interval 0 notification_period 24x7 notification_options c,r check_command check-host-alive } #
notification_intervalは、ステータス異常を通知後、一定の時間を置いてから再度そのステータス異常を通知する設定である。今回は“0”に設定して、一度通知されたステータス異常は再度送信しない。
●timeperiods.cfg
ステータス異常を検知したときに、アラートを通知する時間帯を定義する。監視したい時間帯をこのファイルで定義し、timeperiod_nameで定義した名前をほかのファイルで呼び出して使用する。
# '24x7' timeperiod definition define timeperiod{ timeperiod_name 24x7 alias 24 Hours A Day, 7 Days A Week sunday 00:00-24:00 monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 }
●contactgroups.cfg
ほかのコンフィグファイルで「contacts_group」として定義されている設定を記述するコンフィグファイル。メンバーとして定義されたパラメータ値は、contacts.cfgで定義する。
# 'test-admins' contact group definition define contactgroup{ contactgroup_name test-admins alias Test Administrators members nagios }
●contacts.cfg
「contactgroups.cfg」から、コンフィグファイルのメンバーとして呼び出される設定を定義する。
## 'nagios' contact definition define contact{ contact_name nagios alias Nagios Admin service_notification_period 24x7 host_notification_period 24x7 service_notification_options w,u,c,r host_notification_options d,u,r service_notification_commands notify-by-email host_notification_commands host-notify-by-email email nagios@localhost }
ここで、service_notification_optionsの記述には、次のような意味がある。
w | warning |
---|---|
u | unreachable |
c | critical |
r | recoverey |
また、host_notification_optionsの記述には、次のような意味がある。
d | down |
---|---|
u | unreachable |
r | recoverey |
service_notification として定義されているアラートの通知は、関連するhostが監視時間外の場合には省略される。また、何らかの異常ステータスを通知してきた場合のみ、復旧ステータスの送信を行うように設定されている。(つまり、復旧ステータスのみの通知は行わない)通知先は、emailオプションへ直接記述し、通知内容と実際に発行するコマンドは「service_notification_commands」および「host_notification_commands」から参照される「misccommands.cfg」に記述する。
●misccommands.cfg
異常を検知した場合に、そのアラートを通知するためのコマンドを定義する。command_nameで定義したオブジェクトの名前で、command_lineに記述したコマンドを実行する。
contacts.cfg内で、service_notification_commandsやhost_notification_commandsから、ここで定義されたコマンドオブジェクトの名前を使用する。
# 'notify-by-email' command definition define command{ command_name notify-by-email command_line /usr/bin/printf "%b" "***** Nagios 1.0b6 *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $DATETIME$\n\nAdditional Info:\n\n$OUTPUT$" | /bin/mail -s "** $NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$ } # 'host-notify-by-email' command definition define command{ command_name host-notify-by-email command_line /usr/bin/printf "%b" "***** Nagios 1.0b6 *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $OUTPUT$\n\nDate/Time: $DATETIME$\n" | /bin/mail -s "Host $HOSTSTATE$ alert for $HOSTNAME$!" $CONTACTEMAIL$ }
●checkcommands.cfg
監視のために発行するコマンドを定義する。commandとして定義したオブジェクトの名前はcheck-host-aliveで、この名前をcheck_commandで定義すると、command_lineのように実行される。
# 'check-host-alive' command definition define command{ command_name check-host-alive command_line $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 1 }
check-host-aliveは、pingコマンドを発行するcheck_pingコマンドを修正したもので、3秒間に80%のパケットロスを検知した場合にWarning、5秒間に100%のパケットロスを検知した場合にCriticalエラーと認識する。ここで、-wオプションや-cプションにおける単位は、ms(ミリ秒)である。また、-pオプションによって、1回に発行するICMPパケットの数を定義でき、このコマンドでは、“1”である。
監視に必要なすべての設定をコンフィグファイルへ指定した後、コンフィグファイルの整合性を確認する。コンフィグファイルのチェックは、Nagiosの実行コマンドに-vオプションをつけてメインコンフィグファイルを指定して実行する。
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
これによって、メインコンフィグファイルであるnagios.cfgを読み込み、さらに指定されているすべてのコンフィグファイルの整合性を確認することが出来る。
-v オプションによって確認される点は、次のとおりである。
-vオプション実行後にエラーが出た場合、これらのポイントを念頭に置いて各コンフィグファイルを確認しよう。
【例】
[nagios@nagios etc]$ /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg Nagios 1.0b6 Copyright (c) 1999-2002 Ethan Galstad (nagios@nagios.org) Last Modified: 09-15-2002 License: GPL Reading configuration data... Running pre-flight check on configuration data... Checking services... Checked 3 services. Checking hosts... Checked 3 hosts. Checking host groups... Checked 2 host groups. Checking contacts... Checked 1 contacts. Checking contact groups... Checked 2 contact groups. Checking service escalations... Checked 3 service escalations. Checking host group escalations... Checked 0 host group escalations. Checking service dependencies... Checked 0 service dependencies. Checking host escalations... Checked 0 host escalations. Checking host dependencies... Checked 0 host dependencies. Checking commands... Checked 22 commands. Checking time periods... Checked 4 time periods. Checking for circular paths between hosts... Checking for circular service execution dependencies... Checking global event handlers... Checking obsessive compulsive service processor command... Checking misc settings... Total Warnings: 0 Total Errors: 0 Things look okay - No serious problems were detected during the pre-flight check [nagios@nagios etc]$
コンフィグファイルの準備が終わったら、Nagiosに新しいコンフィグファイルを認識させるためにリスタートする必要がある。Nagiosを実行させていない場合には、普通に実行するだけで問題ない。
基本的に監視ツールを停止することは稀である。そのため、監視ツールのプログラムはバックグラウンドで実行させるべきである。インストール時にinitスクリプトをインストールしたので、このスクリプトを使用して停止・起動・再起動するといいだろう。これらの作業はrootで実行すること。
/usr/rc.d/init.d/nagios stop
/usr/rc.d/init.d/nagios start
/usr/rc.d/init.d/nagios restart
【例】
[root@nagios etc]# /etc/init.d/nagios restart Running configuration check...done Stopping network monitor: nagios Starting network monitor: nagios PID TTY TIME CMD 21671 ? 00:00:00 nagios [root@nagios etc]#
ただし、コンフィグファイルを修正してソフトウェアの再起動を掛けたいときは、コンフィグファイルを読み込ませるためのオプションが用意されているので、そのオプションを利用しよう。
/usr/rc.d/init.d/nagios reload
Nagiosを起動したら、実際に実行されているかどうかプロセスの実行で確認する。
ps axu | grep nagios
このコマンドを実行して得られたpidを使えば、killコマンドを使うことで、Nagiosを停止したり再起動をしたりすることができる。
kill pid
kill -HUP pid
次回はNagiosによる指定URLの監視を設定し、Webサーバの稼働を常に監視する運用について言及する予定である。
Copyright © ITmedia, Inc. All Rights Reserved.