Nagiosのcheck_snmpで警告レベル(WARNING, CRITICAL)別に通知先を変えたい

やりたいこと

  • 警告レベル (WARNING か CRITICAL) によって、通知先を切り替えたい。
    • WARNING は PC メールと IRC
    • CRITICAL は 携帯メールと PC メールと IRC
  • 外部ホストの監視は NRPE じゃなくて SNMP (check_snmp) を使っている。

通知先の切り替え

なぜか warn と crit で contactgroup を別々にせねばという思い込みがあり、単一のservice定義では実現できなさそうと思ってたんですが、ひとつのcontactgroupに、service_notification_optionsがwのとcのcontactを入れとけば OK ですね。(thanks: @toshiak_netmark)

unknownとcriticalは携帯+PC+IRCに、それ以外はPC+IRCに通知するようなcontact, contactgroup の定義はこんな感じで:

define contact {
  contact_name  scramble-mail-critical
  use           generic-contact
  email         sc-crit@example.com # list for mobile and PC mail
  service_notification_commands  notify-service-by-sc-crit
  service_notification_options   u,c
  host_notification_commands     notify-host-by-sc-crit
}
define contact {
  contact_name  scramble-mail-warning
  use           generic-contact
  email         sc-warn@example.com # list for PC mail
  service_notification_commands  notify-service-by-sc-warn
  service_notification_options   w,r,f,s
  host_notification_commands     notify-host-by-sc-warn
}
define contact {
  contact_name  irc
  use           generic-contact
  email         dummy@example.com
  service_notification_commands  notify-service-by-irc
  host_notification_commands     notify-host-by-irc
}

define contactgroup {
  contactgroup_name  scramble
  members            scramble-mail-critical, scramble-mail-warning, irc
}

あとは、service (かその雛形のdefine service) で、contact_groupsをscrambleと指定する。

define service {
  name                   oreno-service
  use                    generic-service
  ...
  contact_groups         scramble
  ...
}

check_snmp で、文字列マッチで WARNING を返す

check_snmp は、

  • 数値の範囲指定の場合は、WARNINGを返すかCRITICALを返すか制御できる (-w, -c)
  • 文字列の正規表現マッチの場合は、OKかCRITICALしか返せない (-r)

なので、文字列の正規表現マッチで WARNING が返せません。

ひいては、WARNINGとCRITICALで通知先が変えられません。

なので -r(-R) と同じような感じで、正規表現にマッチしたら WARNING を返すオプション -g(-G) を追加しました。

コードは github にあります。

たとえば、

define service {
  use                  critical-service
  hostgroup_name       db
  service_description  3ware RAID
  check_command        check_snmp_v1!-o extOutput.2 -r OK -g VERIFY
}

とすると、対象サーバの extOutput.2 の内容が VERIFY の場合は WARNING、OKの場合は OK、それ以外の場合は CRITICAL となります。

おちぼひろい

先のcontactの設定だと、RECOVERYの通知はWARNINGと同じ通知方法で来てしまいます。本当は、CRITICALなservice障害のRECOVERYはCRITICALと同じ通知方法で、WARNINGのRECOVERYはWARNINGと同じ通知方法でしたいのですが、簡単にできる方法が思いつきませんでした。(service_notification_commandsのメール送信コマンドを、Nagiosからのメッセージに応じて送信先を切り替えるようなスクリプトにすればできそうですが)

自分の場合、CRITICALなのだけ携帯にメールが来るようにしてるので、そのRECOVERYの通知は携帯には来ません。これはちょっといまいちかなーと思ったんですが、WARNINGの通位はIRCにも流していて、mobircで携帯からそのIRCチャンネルにアクセスできるので、まぁいいかーと考えています。どのみち、CRITICALが出たらPCひろげてIRCでやりとりしながら障害対応しますし。