連載
» 2002年11月28日 00時00分 公開

24×365のシステム管理(6):Webサーバの24×365監視を実現する 〜その3 NagiosのコンフィグファイルとICMPを設定する〜

前回は、Webサーバの監視ツールの選定と実際のインストール作業について解説しました。今回は、Nagiosのコンフィグファイルの設定について、もう少し踏み込んだ解説をしながら、ICMPによる監視について紹介します。(編集局)

[東原亜紀,ネットベイン]

 Nagiosによる監視の設定は、コンフィグファイルに必要な設定を記述する方式である。ところが、前回の記事(Webサーバの監視?監視ツールの導入)の掲載後に寄せられた質問の中には、このコンフィグの設定に戸惑われている方が多かった。そこで、今回はNagiosのコンフィグファイルについて、もう少し踏み込んだ解説をしたうえで、最も基本的なICMP(ping)による監視を実現するところまでを解説することにした。

Nagiosのコンフィグファイル

 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(ping)による疎通監視の設定≫

 実際にコンフィグファイルのパラメータの意味合いに注意しながら、システム監視の基本である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に新しいコンフィグファイルを認識させるためにリスタートする必要がある。Nagiosを実行させていない場合には、普通に実行するだけで問題ない。

 基本的に監視ツールを停止することは稀である。そのため、監視ツールのプログラムはバックグラウンドで実行させるべきである。インストール時にinitスクリプトをインストールしたので、このスクリプトを使用して停止・起動・再起動するといいだろう。これらの作業はrootで実行すること。

  • Nagiosの停止
/usr/rc.d/init.d/nagios stop
  • Nagiosの起動
/usr/rc.d/init.d/nagios start
  • Nagiosの再起動
/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コマンドを使った Nagios プログラムの停止
kill pid
  • killコマンドを使った Nagios プログラムの再起動
kill -HUP pid

まとめ

 次回はNagiosによる指定URLの監視を設定し、Webサーバの稼働を常に監視する運用について言及する予定である。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。