Nagiosのcheck_snmpで警告レベル(WARNING, CRITICAL)別に通知先を変えたい
やりたいこと
通知先の切り替え
なぜか 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でやりとりしながら障害対応しますし。