k4200’s notes and thoughts

Programmer side of k4200

NagiosでEC2上のLinuxのログ監視(2)

はじめに

前回の続き。やりたい事は、EC2上のLinuxサーバーのApacheログをNagiosで監視して、エラーが発生したらアラートメールを送信。

※このエントリーの続き:第3回

とりあえずローカルのログから

本当にやりたい事はNagiosが動いているのとは別のサーバーのログを監視することなんだけど、その前にローカル(Nagiosが動いているサーバー)のログを監視する設定から。

ツッコミ大歓迎

今回初めてNagiosを触っているので、何かおかしなところはご指摘頂ければ・・・

必要なパッケージをインストール

[root@local ~]# yum install nagios
[root@local ~]# yum install nagios-plugins-nrpe
[root@local ~]# yum install nagios-plugins-ping

nagios-plugins-ping はログ監視には直接関係ないけど、入れておく。

Nagiosの設定ファイルを理解する

Nagiosは設定が複雑になりがちっぽいので、複数のファイルに分けるのが流儀らしい。

でも、Nagiosの設定を解説している色んなページの設定ファイルの構成例と、Amazon LinuxRPMで入れた場合のデフォルト設定ファイルの構成が結構違うので、初心者には困る。

とりあえず、自分なりの理解で書いていく。

「コマンド」の定義

/etc/nagios/objects の下に色々ファイルがあるが、まずは commands.cfg から。これは、Nagiosが監視を実行する際に起動するコマンドの定義。以下のようなデフォルトの監視コマンドが沢山定義されているけど、それらの設定はcheck_ping を除いて全てコメントアウト(あるいはさっぱり削除)する。

define command{
        command_name    check_local_disk
        command_line    $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
        }

上の例の設定は、「check_local_disk」 という名前の「コマンド(≠Linuxのコマンド)」を定義していて、そのコマンドはマシン上にある $USER1$/check_disk という名前の(Linuxの)コマンドを、3つの引数付きで実行する。

$USER1 は、Amazon Linuxの場合 /usr/lib/nagios/plugins/ になる。$ARG1$ 〜 $ARG3$ は、次項で説明する「サービス」定義のところで指定される。

「サービス」の定義

次に /etc/nagios/objects/localhost.cfg を開く。こちらはサービスの監視に関する定義などで、前項で説明した「コマンド」をどのような引数でどのようなタイミングで呼び出すか等を設定するもの。

define service{
        use                             local-service         ; Name of service template to use
        host_name                       localhost
        service_description             Root Partition
        check_command      check_local_disk!20%!10%!/
        }

上の例だと、先程 check_local_disk というNagiosの「コマンド」を、20%, 10%, / という3つの引数を付けて実行する。また、「use local-service」というのは、「local-service」という「サービス」定義を継承するという意味。こうすることで、色んなサービスで共通で使われる設定をテンプレート的にまとめておくことが出来る。

local-service は /etc/nagios/objects/templates.cfg 内に、以下のように定義されている。local-serviceは更にgeneric-serviceを参照しているけど、まぁ詳細は割愛。

define service{
	name				local-service 		; The name of this service template
	use				generic-service		; Inherit default values from the generic-service definition
        max_check_attempts              4			; Re-check the service up to 4 times in order to determine its final (hard) state
        normal_check_interval           5			; Check the service every 5 minutes under normal conditions
        retry_check_interval            1			; Re-check the service every minute until a hard state can be determined
        register                        0       		; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!
	}

check_local_disk の話に戻ると、「コマンド」定義の所で以下のような記述があるので、

$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$

実際には以下のLinuxコマンドが実行される。

/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /
「連絡先」の定義

/etc/nagios/objects/contacts.cfg にアラートが発生した時の連絡先が記述できる。大きい組織向けにグループ分けとかできるけど、とりあえずは自分1人にメールが来ればいいので、メアドを自分のものに変更すればOK。

check_logfiles の設定

前項まででNagios基本的な設定が理解できた、と思いたい・・・

ここでは、check_logfiles の設定を行なっていく。

コマンド定義

まずは答えから先に書くと、check_logfiles のコマンド定義は以下のようになる。

define command {
  command_name check_logfiles
  command_line $USER1$/check_logfiles --config $ARG1$
}

check_logfiles のRPMをインストールすると、 /usr/lib/nagios/plugins/check_logfiles がインストールされる。check_logfilesの実体はPerlスクリプトで、実行時に --config オプションで設定ファイルのパスを取る。

check_logfiles の設定ファイル

設定ファイルは以下のような内容で作成。このファイルをどこに置くかちょっと迷ったけど、とりあえず /etc/nagios/conf.d/localhost_log_phperror.cfg という名前で作成した。

設定ファイルの説明は特に不要かと。詳細はcheck_logfilesのサイトに書いてあるので、そちらをどうぞ。

$MACROS = {
  APACHELOGDIR => '/var/log/httpd'
};
@searches = ({
  tag => 'phperror',
  logfile => '$APACHELOGDIR$/error_log',
  criticalpatterns => [
      '.*PHP Fatal error.*',
      '.*\[EMERG\].*',
      '.*\[ALERT\].*',
      '.*\[CRIT\].*' ]
});

後は、このコマンドを直接シェルから実行してみて、特にエラーが出なければOK。

# /usr/lib/nagios/plugins/check_logfiles --config /etc/nagios/conf.d/localhost_log_phperror.cfg
OK - no errors or warnings|phperror_lines=0 phperror_warnings=0 phperror_criticals=0 phperror_unknowns=0
サービス定義

サービス定義は、localhost.cfg に以下の通り記述した。

ログ監視に関する汎用的な設定項目は、logfile-check という名前の「サービス」として定義した。

check_logfilesのサイトによると、service descriptionと設定ファイルの名前を同一にしておくと良いらしい。

define service {
  name logfile-check ;
  service_description logfile-check
  use generic-service ;
  is_volatile 1
  check_period 24x7
  max_check_attempts 1
}

define service {
  service_description   localhost_log_phperror
  host_name             localhost
  check_command         check_logfiles!/etc/nagios/conf.d/$SERVICEDESC$.cfg
  use                   logfile-check
}

起動、トラブルシューティング

大事な事

その前に大事な事を説明。

Nagiosの設定ファイルにエラーがあると、再起動や設定再読み込みの際に以下のようなエラーが出る。

[root@local ~]# /etc/init.d/nagios reload
Running configuration check... CONFIG ERROR!  Reload aborted.  Check your Nagios configuration.

エスパーじゃない限りこのエラーメッセージでトラブルシューティングは不可能なんだけど、以下のコマンドを使うと詳細なメッセージが出る。

# nagios -v /etc/nagios/nagios.cfg

これを知っているのと知らないのとでは大違いだと思う。自分はこれを知らないで3時間くらい無駄に過ごしたので・・・

いざ起動

ここまでで設定は完了しているはずなので、Nagiosの設定ファイルを再読み込みする。

$ sudo /etc/init.d/nagios reload

自分の場合、以下のようなエラーが出た。

Feb 15 08:18:51 ip-xx-xx-xx-xx nagios: SERVICE ALERT: localhost;CritLogFile;UNKNOWN;HARD;1;Log check error: Log file /var/log/http/error.log does not exist!

Nagiosnagiosユーザーの権限で動作するので、デフォルトだとApacheのログを読めない。と言う事で、権限変更。

# ls -ld /var/log/httpd/
drwx------ 2 root root 4096 Feb 12 03:49 /var/log/httpd/
# chmod 755 /var/log/httpd/

後は、人為的にエラーを発生させてみて、ちゃんとメールが来ればOKだけど、ここでは省略。

まとめ

今回はNagiosを使ってローカルのログファイルを監視するところまで。分かっちゃえばそんな難しくないけど、自分の場合理解するまでに結構時間がかかった。このブログエントリーが何かの役に立てば幸い。

次回は、リモートのログを監視する所を説明。

以下、作業ログ(自分用)

[root@local ~]# yum install nagios-plugins-ping
Loaded plugins: fastestmirror, priorities, security, update-motd
Loading mirror speeds from cached hostfile
 * amzn-main: packages.ap-northeast-1.amazonaws.com
 * amzn-updates: packages.ap-northeast-1.amazonaws.com
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nagios-plugins-ping.i686 0:1.4.15-2.5.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================================
 Package                                 Arch                     Version                                 Repository                     Size
==============================================================================================================================================
Installing:
 nagios-plugins-ping                     i686                     1.4.15-2.5.amzn1                        amzn-main                      27 k

Transaction Summary
==============================================================================================================================================
Install       1 Package(s)

Total download size: 27 k
Installed size: 49 k
Is this ok [y/N]: y
Downloading Packages:
nagios-plugins-ping-1.4.15-2.5.amzn1.i686.rpm                                                                          |  27 kB     00:00     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing : nagios-plugins-ping-1.4.15-2.5.amzn1.i686                                                                                  1/1 

Installed:
  nagios-plugins-ping.i686 0:1.4.15-2.5.amzn1                                                                                                 

Complete!
[root@local nagios]# yum install nagios-plugins-nrpe
Loaded plugins: fastestmirror, priorities, security, update-motd
Loading mirror speeds from cached hostfile
 * amzn-main: packages.ap-northeast-1.amazonaws.com
 * amzn-updates: packages.ap-northeast-1.amazonaws.com
amzn-main                                                                                                              | 2.1 kB     00:00     
amzn-updates                                                                                                           | 2.3 kB     00:00     
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nagios-plugins-nrpe.i686 0:2.12-16.2.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================================
 Package                                  Arch                      Version                              Repository                      Size
==============================================================================================================================================
Installing:
 nagios-plugins-nrpe                      i686                      2.12-16.2.amzn1                      amzn-main                       18 k

Transaction Summary
==============================================================================================================================================
Install       1 Package(s)

Total download size: 18 k
Installed size: 36 k
Is this ok [y/N]: y
Downloading Packages:
nagios-plugins-nrpe-2.12-16.2.amzn1.i686.rpm                                                                           |  18 kB     00:00     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing : nagios-plugins-nrpe-2.12-16.2.amzn1.i686                                                                                   1/1 

Installed:
  nagios-plugins-nrpe.i686 0:2.12-16.2.amzn1                                                                                                  

Complete!