2012年8月26日日曜日

nagiosで分散監視


目的
nagiosで分散監視を実施する。



簡易構成図
        nagios              ← 中央サーバ(親)
          |      
nagios  nagios  nagios …    ← 集約サーバ群(子)



監視項目、役割
● 中央サーバ(親)
集約サーバ(子)からの通知を受け付ける受動監視に徹する。
親側ではホスト、サービス監視共に能動的に監視をさせないということである。
発報条件として試行回数(Attempt)は1/1にする。


● 集約サーバ(子)
以下を受け持つ。
・能動監視
・受動監視
・TRAP監視(nagiosとの連携方法についてはこちらを参照のこと)

能動監視はnotificationの機能を使い、結果をsend_nscaコマンドで親側へ通知する。

notificationの発動条件(能動、受動、TRAP監視用のテンプレートは別途説明する)。
・ハードエラー時
試行回数を3/3にしておけば、3回目のNG時にnotificationは発動する。
また、復旧時は1/3でnotificationは動作する。

・能動監視時はハードエラーが継続する場合は、
一度アラームがあがったらステータスが変化しない限り通知させない。
検知漏れが怖いなら設定ディフォルトの240分(notification_interval)後に
再通知でもいいだろう。

・受動監視時は試行回数を1/1にしておけば、毎回1回目のNG時にnotificationが発動する。
ステータスが変化しない場合にも発動させる(is_volatileは有効に)。

・HOSTがダウンするとサービス監視は実施されなくなる。
監視が動作しないと慌てないこと。


TRAP監視はnagiosのイベントハンドラ(event_handler)の機能を使い親側へ通知する。
event_handler経由で実行するコマンドは上記と同じくsend_nscaである。
notificationを使わない理由だが、TRAPが複数上がった場合に、
前のアラームが上書きされ、それに気がつかない事態を防ぎたいためである。
TRAP監視のステータスは基本warningとし、warningの状態時に、
再度アラームがTRAPを受けた場合は、ステータスをcriticalとして親側に再通知させる。

イベントハンドラコマンドが実行されるタイミングを確認しておく。
・ソフトエラー状態にある時

・最初にハードエラー状態になった時

・ソフト又はハードエラー状態から復旧する時

ソフトエラーの状態でも実行される点がnotificationと異なる。

サービス名を、TRAP [hoge]、TRAP [piyo]などと分けてもいいのだが、監視対象数は増やしたくない。
nagisoはステータスの管理をデータベースではなくファイルでやっているためである。
TRAPとアラームは一つにし、ステータスのインフォメーションに内容を記載すればいいだろう。



前提
親側、子側に以下のパッケージはインストール済みとする。
・nagios    
・nagios-devel
・nagios-www  
・nagios-plugins
・nagios-nsca ← 分散監視に利用する



親・子nagios共通設定
● /etc/nagios/nagios.cfg
#設定ファイルはconf.d配下に独自に用意する
#cfg_file=/etc/nagios/objects/commands.cfg
#cfg_file=/etc/nagios/objects/contacts.cfg
#cfg_file=/etc/nagios/objects/timeperiods.cfg
#cfg_file=/etc/nagios/objects/templates.cfg
#cfg_file=/etc/nagios/objects/localhost.cfg
cfg_dir=/etc/nagios/conf.d

# ステータスファイルはメモリ上におきIO処理を高速化させる
status_file=/dev/shm/status.dat

# command_fileはディフォルトのままでいいだろうが、変更するなら確認必要
command_file=/var/log/nagios/rw/nagios.cmd


● /etc/nagios/cgi.cfg
# 認証関係の設定
authorized_for_system_information=*
authorized_for_configuration_information=*
authorized_for_system_commands=*
authorized_for_all_services=*
authorized_for_all_hosts=*
authorized_for_all_service_commands=*
authorized_for_all_host_commands=*

# 音声ファイルの設定
host_unreachable_sound=hostdown.wav
host_down_sound=hostdown.wav
service_critical_sound=critical.wav
service_warning_sound=warning.wav
service_unknown_sound=warning.wav
normal_sound=noproblem.wav

# 監視の結果にhtmlタグを出力させる可能性があるためエスケープはしない
escape_html_tags=0


親側nagiosの設定
● /etc/nagios/nagios.cfg
# nagios起動時のサービス確認は親側は不要
execute_service_checks=0

# パッシブホストチェック、パッシブサービスチェックを有効化
# 子側からの通知を受け取るため
accept_passive_service_checks=1
accept_passive_host_checks=1

# 外部コマンドを有効化
# 親、子どちらかだけで外部コマンドを実行できるポリシーにしてもよい
check_external_commands=1


● /etc/nagios/conf.d/base/hosts.cfg
基本となるホストの設定を記載する。
赤色は子側との設定の相違である。
define host {
  name                            nsca-host
  active_checks_enabled           0
  passive_checks_enabled          1
  notifications_enabled           1
  event_handler_enabled           0
  flap_detection_enabled          0
  process_perf_data               0
  retain_status_information       1
  retain_nonstatus_information    1
  check_period                    none
  max_check_attempts              1
  contact_groups                  admins
  notification_options            n
  register                        0
}
check_periodがnoneの理由を補足しておく。
check_freshnessが1ならfreshness_reportが動いてしまう。


● /etc/nagios/conf.d/base/services.cfg
基本となるサービスの設定を記載する
define service{
  name                            nsca-service
  active_checks_enabled           0
  passive_checks_enabled          1
  parallelize_check               1
  obsess_over_service             0
  check_freshness                 0
  notifications_enabled           1
  event_handler_enabled           0
  flap_detection_enabled          0
  process_perf_data               0
  retain_status_information       1
  retain_nonstatus_information    1
  is_volatile                     0
  check_period                    none
  max_check_attempts              1
  contact_groups                  admins
  notification_options            n
  notification_interval           240
  notification_period             24x7
  check_command                   no_report
  register                        0
}


● /etc/nagios/conf.d/service/services.cfg
各種サービスの設定を記載する。
手順の簡略化のため、ホストグループ、ホストの設定ファイルも
ここへあわせて記載する。当然管理のため分けてもよい。
define hostgroup {
  hostgroup_name    frontend_service
  alias             frontend_service
}

define hostgroup {
  hostgroup_name    backend_service
  alias             backend_service
}

define host {
  use           nsca-host
  host_name     host1
  hostgroups    frontend_service
}

define host {
  use           nsca-host
  host_name     host2
  hostgroups    backend_service
}


define service {
  use                    nsca-service
  host_name              host1, host2
  service_description    RESOURCE [load average]
}

define service{
   use                   nsca-service
   host_name             host1, host2
   service_description   PASSIVE [log]
}

define service {
  use                    nsca-service
  host_name              host1, host2
  service_description    TRAP
}


● /etc/nagios/nsca.cfg
子側からの通知を受け付けるデーモンの設定だが、
変更するとしたらポート番号と、nagios.cfgで指定したcommand_fileと
同じ場所を指すようにそこを見直すぐらいだろうか。
server_port=15667

command_file=/var/log/nagios/rw/nagios.cmd



子側nagiosの設定
● /etc/nagios/nagios.cfg
# nagios起動時のサービス確認は子側は必要
execute_service_checks=1

# パッシブホストチェック、パッシブサービスチェックを有効化
# 子側であっても監視対象ノードから受動的に結果を受け取ることがある
accept_passive_service_checks=1
accept_passive_host_checks=1

# 外部コマンドを有効
# 親、子どちらかだけで外部コマンドを実行できるポリシーにしてもよい
check_external_commands=1

# obsess over ホストとサービスは使わない(ディフォルト0)
# obsessを利用した分散環境を作らないため明示的に0としておく
obsess_over_hosts=0
obsess_over_services=0

# ochp(Obsessive Compulsive Host Processor)コマンドは使わない
#ochp_command=somecommand

# ocsp(Obsessive Compulsive Service Processor)コマンドは使わない
#ocsp_command=somecommand



● /etc/nagios/conf.d/base/hosts.cfg
基本となるホストの設定を記載する。
赤色は親側との設定の相違である。
define host {
  name                            active-host
  notifications_enabled           1
  event_handler_enabled           0
  flap_detection_enabled          0
  process_perf_data               0
  retain_status_information       1
  retain_nonstatus_information    1
  check_period                    24x7
  max_check_attempts              3
  normal_check_interval           2
  retry_check_interval            1
  contact_groups                  nscas
  notification_options            d,u,r
  notification_interval           240
  notification_period             24x7
  check_command                   check-host-alive
  register                        0
}


● /etc/nagios/conf.d/base/services.cfg
緑色は子側内の設定との相違点である。
define service {
  name                            active-service
  active_checks_enabled           1
  passive_checks_enabled          1
  parallelize_check               1
  obsess_over_service             0
  check_freshness                 0
  notifications_enabled           1
  event_handler_enabled           0
  flap_detection_enabled          0
  process_perf_data               0
  retain_status_information       1
  retain_nonstatus_information    1
  is_volatile                     0
  check_period                    24x7
  max_check_attempts              3
  normal_check_interval           4
  retry_check_interval            1
  contact_groups                  nscas
  notification_options            u,w,c,r
  notification_interval           240
  notification_period             24x7
  register                        0
}


define service {
  name                            passive-service
  active_checks_enabled           0
  passive_checks_enabled          1
  parallelize_check               1
  obsess_over_service             0
  check_freshness                 0
  notifications_enabled           1
  event_handler_enabled           0
  flap_detection_enabled          0
  process_perf_data               0
  retain_status_information       1
  retain_nonstatus_information    1
  is_volatile                     1
  check_period                    none
  max_check_attempts              1
  normal_check_interval           1
  retry_check_interval            1
  contact_groups                  nscas
  notification_options            u,w,c,r
  notification_interval           240
  notification_period             24x7
  check_command                   check_dummy!0!"OK"
  register                        0
}


define service {
  name                            trap-service
  active_checks_enabled           0
  passive_checks_enabled          1
  parallelize_check               1
  obsess_over_service             0
  check_freshness                 0
  notifications_enabled           1
  event_handler_enabled           1
  flap_detection_enabled          0
  process_perf_data               0
  retain_status_information       1
  retain_nonstatus_information    1
  is_volatile                     1
  check_period                    none
  max_check_attempts              2
  normal_check_interval           1
  retry_check_interval            1
  contact_groups                  nscas
  notification_options            none
  notification_interval           240
  notification_period             24x7
  register                        0
}



● /etc/nagios/conf.d/service/services.cfg
各種サービス固有の設定を記載する
親側での設定と同様に手順の簡略化のため、ホストグループ、ホストの
設定ファイルもここへあわせて記載する。
define hostgroup {
  hostgroup_name    frontend_service
  alias             frontend_service
}

define hostgroup {
  hostgroup_name    backend_service
  alias             backend_service
}


define host {
  use           active-host
  host_name     host1
  address       10.0.0.1
  hostgroups    frontend_service
}

define host {
  use           active-host
  host_name     host2
  address       10.0.0.2
  hostgroups    backend_service
}


define service {
  use                    active-service
  host_name              host1, host2
  service_description    RESOURCE [load average]
  check_command          check_loadaverage!30,30,30!50,50,50
}

define service{
   use                   passive-service
   host_name             host1, host2
   service_description   PASSIVE [log]
   check_command         check_dummy!0!"OK"
}

define service{
   use                   trap-service
   host_name             host1, host2
   service_description   TRAP
   event_handler         notify-service-by-send_nsca_for_trap
   check_command         check_dummy!0!"OK"
}



● /etc/nagios/conf.d/base/contacts.cfg
試行回数をを3/3にしておけば、3回目のNG時にnotificationが発動する。
また、復旧時は1/3でnotificationは動く。
HOSTがダウンするとサービス監視は実施されなくなるため、
監視が動作しないと慌てないこと。
define contact {
  name                             nsca-contact
  service_notification_period      24x7
  host_notification_period         24x7
  service_notification_options     w,u,c,r,f,s
  host_notification_options        d,u,r,f,s
  service_notification_commands    notify-service-by-send_nsca
  host_notification_commands       notify-host-by-send_nsca
  register                         0
}


define contact {
  contact_name    nscaadmin
  use             nsca-contact
  alias           Nsca Admin
}


define contactgroup {
  contactgroup_name    nscas
  alias                Nagios Nacas
  members              nscaadmin
}


● /etc/nagios/conf.d/base/commands.cfg
# for notification
define command {
  command_name    notify-host-by-send_nsca
  command_line    /usr/lib/nagios/plugins/submit_check_result_host $HOSTNAME$ $HOSTSTATEID$ '$HOSTOUTPUT$'
}

define command {
  command_name    notify-service-by-send_nsca
  command_line    /usr/lib/nagios/plugins/submit_check_result_service $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$'
}


# for event handler
define command {
  command_name    notify-service-by-send_nsca_for_trap
  command_line    /usr/lib/nagios/plugins/submit_check_result_service_for_trap $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$' $SERVICESTATETYPE$
}


【補足】
親側にnagiosではなくOVOを使う場合は、
syslogに結果を吐かせればいいだろう。
define command {
  command_name    notify-host-by-logger
  command_line    /bin/logger -p local6.info "Nagios  `/usr/bin/printf \"%b\" \"[SERVICE NAME] Type: $NOTIFICATIONTYPE$, Host: $HOSTNAME$, State: $HOSTSTATE$, Address: $HOSTADDRESS$, Info: $HOSTOUTPUT$, Date/Time: $LONGDATETIME$\"`"
}

define command {
  command_name    notify-service-by-logger
  command_line    /bin/logger -p local6.info "Nagios  `/usr/bin/printf \"%b\" \"[SERVICE NAME] Type: $NOTIFICATIONTYPE$, Host: $HOSTNAME$, Service: $SERVICEDESC$, State: $SERVICESTATE$, Date/Time: $LONGDATETIME$, Additional Info: $SERVICEOUTPUT$\"`"
}


● /usr/lib/nagios/eventhandlers/submit_check_result_host 
#!/bin/sh
return_code=3

case "$2" in
  UP)
    return_code=0
    ;;
  DOWN)
    return_code=1
    ;;
  UNREACHEBLE)
    return_code=2
    ;;
  UNKNOWN)
    return_code=3
    ;;
esac

#/usr/bin/printf "%s\t%s\t%s\n" "$1" "$2" "$3"  >> /var/tmp/debug_host
/usr/bin/printf "%s\t%s\t%s\n" "$1" "$2" "$3"  | /usr/sbin/send_nsca $親サーバのIPアドレス -c /etc/nagios/send_nsca.cfg

実行権限を与えておくこと。
# chmod 755 /usr/lib/nagios/eventhandlers/submit_check_result_host


● /usr/lib/nagios/eventhandlers/submit_check_result_service
#!/bin/sh
return_code=3

case "$3" in
  OK)
    return_code=0
    ;;
  WARNING)
    return_code=1
    ;;
  CRITICAL)
    return_code=2
    ;;
  UNKNOWN)
    return_code=3
    ;;
esac

#/usr/bin/printf "%s\t%s\t%s\t%s\n" "$1" "$2" "$return_code" "$4" >> /var/tmp/debug_service
/usr/bin/printf "%s\t%s\t%s\t%s\n" "$1" "$2" "$return_code" "$4" | /usr/sbin/send_nsca $親IP -c /etc/nagios/send_nsca.cfg

実行権限を与えておくこと。
# chmod 755 /usr/lib/nagios/eventhandlers/submit_check_result_service


● /usr/lib/nagios/eventhandlers/submit_check_result_service_for_trap
#!/bin/sh
return_code=3

case "$3" in
  OK)
    return_code=0
    ;;
  WARNING)
    return_code=1
    ;;
  CRITICAL)
    return_code=2
    ;;
  UNKNOWN)
    return_code=3
    ;;
esac

if [ $return_code == 0 ];then
  /usr/bin/printf "%s\t%s\t%s\t%s\n" "$1" "$2" 0 "$4" | /usr/sbin/send_nsca $親IP -c /etc/nagios/send_nsca.cfg
else
  case "$5" in
    SOFT)
      /usr/bin/printf "%s\t%s\t%s\t%s\n" "$1" "$2" 1 "$4" | /usr/sbin/send_nsca $親IP -c /etc/nagios/send_nsca.cfg
    ;;
    HARD)
      /usr/bin/printf "%s\t%s\t%s\t%s\n" "$1" "$2" 2 "$4" | /usr/sbin/send_nsca $親IP -c /etc/nagios/send_nsca.cfg
    ;;
  esac

fi

実行権限を与えておくこと。
# chmod 755 /usr/lib/nagios/eventhandlers/submit_check_result_service_for_trap



nagiosのコンフィグ確認
親・子共に実施
# /usr/sbin/nagios -v /etc/nagios/nagios.cfg



nagiosの起動
親・子共に実施する。
# /etc/init.d/nagios start

親だけで実施する。
# /etc/init.d/nsca start