Nagios 3系 ログ監視用のテンプレート
Nagios でログ監視を行う場合、デフォルト設定のままでは意図した動作にならないことがある。
注意点と対策についてメモしておく。
環境
- CentOS 6.3
- Nagios Core 3.5.0 (Nagios - Download Nagios Core)
- Nagios Plugins 1.4.16 (Nagios - Download Nagios Plugins)
監視要件
- 5分間隔(以下、インターバルとする)で、サーバ内のあらかじめ設定した任意のログファイル
(UTF-8エンコーディングのテキストファイル) をチェックする - インターバルの間に更新された行について、特定の正規表現パターン(以下、検知文字列とする)
にマッチする場合、あらかじめ設定した任意のメールアドレスに通知メールを発信する - 検知文字列の内容によって WARNING と CRITICAL のレベルを出し分ける
- 検知文字列が含まれている行であっても、特定の正規表現パターン(以下、監視除外文字列とする)
とマッチしたら通知は行わない - インターバルの間に複数の行が検知された場合でも通知メールは1通だけとする。
その場合、検知された行全てのテキストをメール本文に含める必要はない
問題点
- デフォルトのプラグイン「check_log」ではレベルの出し分け、監視除外文字列の設定ができない
=> check_log3.pl を使えばよい (check_log3.pl - Nagios Exchange) - 営業時間外のメッセージが通知されない
=> テンプレート(templates.cfg) の linux-server では、通知時間帯 (notification_period) がデフォルトで
workhours に設定されている。
これは timeperiods.cfg に記述されている 月曜〜金曜 9:00-17:00 の時間帯定義であり
それ以外の時間帯には通知が抑止されてしまう。 - Nagios の実行ユーザに、/var/adm/messages などのログファイルの参照権限がない
=> sudo コマンドを介して check_log3.pl を実行する必要がある。
そのとき、requiretty が設定されていると sudo に失敗してしまう。 - リトライ回数が指定されている場合、通知が行われない
=> 試行回数 (max_check_attemps) が 2以上に設定されていると、異常を検知した後(デフォルトは1分後)
に自動的にリトライが行われる。
リトライが正常終了となれば(ログ監視の場合は大半がこのパターンだろう)、一切の通知は行われない。 - 検知文字列が連続したインターバルに出力されたとき、2回目以降が検知されない
=> デフォルトのサービスは異常状態が続いた時は notification_interval の間隔
(デフォルト1時間)でしか通知が行われない。
ログ監視の場合はインターバルごとに異常を検知する必要があるので Volatile(=変わりやすい、の意)
サービスに設定する必要がある。 - フラッピング状態となった場合に通知が行われない
=> Nagios 3系では、デフォルトでフラッピング(監視対象の状態が頻繁に変化する状態のときに不要な
通知を抑止する機能)が有効となっており、正常・異常の状態が頻繁に変わると一定時間
一切の通知が行われなくなる。 - 不要な RECOVERY メッセージが通知される
=> サービスで通知される種別のデフォルト (notification_options) は
WARNING(w), UNKNOWN(u), CRITICAL(c), 復旧状態(r) の4つ。
w, u, c のみに変更するとよい。
対応策
- 追加プラグイン check_log3.pl を libexec ディレクトリ以下に配備する
ファイルに実行パーミッションを付与すること - visodo コマンドを行い、Nagios 実行ユーザに対して適切な権限を追加する
/etc/sudoers 設定例
Defaults:nagios !requiretty nagios ALL=NOPASSWD:/usr/local/nagios/libexec/check_log3.pl
Nagios によるチェックは TTY でないので、Cronと同様 requiretty を無効化するのがポイント。 - ログ監視サービス用のテンプレート例 (templates.cfg)
define service{ use local-service name check-log-service is_volatile 1 max_check_attemps 1 flap_detection_enabled 0 notification_options w,u,c register 0 }
- コマンド定義例 (commands.cfg)
define command{ command_name check_log_crit command_line sudo $USER1$/check_log3.pl -l $ARG1$ -s $ARG2$ -p $ARG3$ -c 1 $ARG4$ } define command{ command_name check_log_warn command_line sudo $USER1$/check_log3.pl -l $ARG1$ -s $ARG2$ -p $ARG3$ $ARG4$ }
(検知行数ではなく)検知文字列によってレベルを出し分ける場合は、2つのサービスに分けて登録する必要がある。
- サービス定義例
define service{ use check-log-service host_name localhost service_description SysLog Warn check_command check_log_warn!/var/log/messages!/tmp/.messages.warn.seek!warn!-i }
"-i" は英大文字・小文字の区別をなくすオプション。(ignore case)
補足
NRPEを利用してリモートサーバのログを監視する場合、デフォルトの10秒のタイムアウトでは間に合わない場合がある。
check_nrpe コマンドのオプションとしてタイムアウト(-t)を明示的に指定することをお勧めする。
- コマンド定義例 (タイムアウトを30秒に設定、ARG2 でその他のオプションを設定可能に)
define command{ command_name check_nrpe command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 30 $ARG2$ }
check_log3.pl 自体のタイムアウトは
/usr/local/nagios/libexec/utils.pmの記載内容を引き継いでいるので
タイムアウトを引き延ばす場合は Perl スクリプト側の修正も必要。(デフォルト15秒)
0 件のコメント:
コメントを投稿