Vor Kurzem stand ich im Rahmen eines Kundentermins vor der Anforderung noch die Benachrichtigungen für das Icinga 2 Setup umzusetzen. „Soweit kein Problem“ dachte ich mir, allerdings war die genaue Anforderung dann doch etwas speziell: Sowohl bei Hosts als auch bei Services können SLA’s gesetzt werden („gold“, „silver“ oder „bronze“). Wenn bei einem Service kein SLA gesetzt ist, greift das Servicelevel des Hosts. Hier der erste Entwurf dazu:
apply Notification "host-mail-gold" to Host { import "mail-host-notification" period = "gold" users = host.vars.contacts assign where host.vars.sla == "gold" } apply Notification "service-mail-gold" to Service { import "mail-service-notification" period = "gold" users = service.vars.contacts assign where (host.vars.sla == "gold" && ! service.vars.sla) || (service.vars.sla == "gold") }
Auch bei nicht vorhandenen Kontakten an Services sollte es so sein, das sie vom jeweiligen Host herangezogen werden. Also wurde die Service-Regel nochmal angepasst:
apply Notification "service-mail-gold" to Service { import "mail-service-notification" period = "gold" if (service.vars.contacts) { users = service.vars.contacts } else { users = host.vars.contacts } assign where (host.vars.sla == "gold" && ! service.vars.sla) || (service.vars.sla == "gold") }
Weitere Anforderung: Es gibt nicht nur Mail- sondern auch Voice-Alarmierung. Dafür gibt es jeweils verschiedene Kontakte, die entweder mit „mail“ oder „voice“ beginnen. Besondere Herausforderung dabei, die Kontakte können auch gemischt sein:
apply Notification "host-mail-gold" to Host { import "mail-host-notification" period = "gold" users = host.vars.contacts assign where host.vars.sla == "gold" && regex("^mail", host.vars.contacts, MatchAny) } apply Notification "service-mail-gold" to Service { import "mail-service-notification" period = "gold" if (service.vars.contacts) { users = service.vars.contacts } else { users = host.vars.contacts } assign where host.vars.sla == "gold" && ! service.vars.sla && ! service.vars.contacts && regex("^mail", host.vars.contacts, MatchAny) assign where host.vars.sla == "gold" && ! service.vars.sla && service.vars.contacts && regex("^mail", service.vars.contacts, MatchAny) assign where service.vars.sla == "gold" && ( regex("^mail", service.vars.contacts, MatchAny) || (regex("^mail", host.vars.contacts, MatchAny) && ! service.vars.contacts)) }
Das Ganze dann mal drei (jeweils eine Host- und eine Service-Regel für „gold“, „silver“ und „bronze“) gibt insgesamt sechs Notification-Regeln, die dem Kunden über 55.000 Benachrichtigungsobjekte beschert und ihn damit glücklich gemacht haben.