Seite wählen

NETWAYS Blog

Benachrichtigungen mit Icinga 2 mal anders

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")
}

mehr lesen…

Markus Waldmüller
Markus Waldmüller
Head of Strategic Projects

Markus war bereits mehrere Jahre als Sysadmin in Neumarkt i.d.OPf. und Regensburg tätig. Nach Technikerschule und Selbständigkeit ist er nun Anfang 2013 bei NETWAYS als Senior Manager Services gelandet. Seit September 2023 kümmert er sich bei der NETWAYS Gruppe um strategische Projekte. Wenn er nicht gerade die Welt bereist, ist der sportbegeisterte Neumarkter mit an Sicherheit grenzender Wahrscheinlichkeit auf dem Mountainbike oder am Baggersee zu finden.

Icinga 2 – Multi-Zonen Notifications

Komplexe Monitoring Umgebungen mit Icinga 2 kennt man ja schon und auch was sich alles mit den Satelliten und zus. Zonen-Mastern anstellen lässt. Aber wisst ihr auch, dass sich gezielte Benachrichtigungen für einzelne Zonen definieren lassen? Die meisten nutzen wahrscheinlich schlicht nur die Haupt/Master Zone für Notifications; aber gehen wir doch von einem nicht unüblichen Beispiel aus : Der externen Überwachung des eigenen Monitorings.
Wir wollen, dass der externer Satellit uns autark kontaktiert sobald das Monitoring ausfällt und im Sinne des Directors, ebenso wenig eine manuell Konfiguration pflegen. Jetzt muss er die Benachrichtigung nur irgend wie zu uns bekommen. Das Wissen über die Objekte sollte bei solchen Setups vorhanden sein, daher werde ich keine Screens oder Config-Auszüge einfügen, sondern nur das Vorgehen beschreiben.
Wie einfach das Ganze mit Zonen-Verzeichnissen und einem Parameter realisiert werden kann, zeigt sich wie folgt. Wir generieren das entsprechende Notification-Command für den Satelliten und stellen sicher, das er es, sowie die betreffenden Kontakte, in seiner Zone finden kann. Anschließend folgt auch schon das Notification Objekt, welches a.) einfach mit in das Zonen-Verzeichnis des Satelliten geschoben, oder b.) global um den Parameter „zone“ erweitert wird. Und schon kann es los gehen.
All das lässt sich übrigens auch wunderbar in einem NWS Satelliten abbilden. Probiert es einfach mal aus.

Telegram Notifications von Icinga 2

Ich nutze nun Telegram privat schon seit einiger Zeit, mir gefällt der Messenger und man kann dort auch sehr schön Bots einbinden.
Für meine privaten Systeme hat mich E-Mail für Notifications immer ein bisschen gestresst. Man möchte doch eigentlich nur kurz die Info sehen, was zählt ist doch eh der aktuelle Status im Dashboard. Mails muss man immer wegräumen/löschen.
Warum also nicht die Notifications via Bot an mich in Telegram schicken? Nichts einfacher als das.
In einem GitHub Repository habe ich alles nötige (auf Englisch) zusammengefasst. Doch hier gerne noch ein wenig auf Deutsch erklärt.
mehr lesen…

Icinga 2 Notifications manuell testen

Bei jeder Installation von Icinga 2 sollte das Notificationsystem getestet werden.
Je nach Installation werden verschiedene Gruppen eingerichtet, die abhängig vom Service beachrichtigt werden sollen. Solche Testbenachrichtigungen können in der Oberfläche von Icinga Web 2 erzeugt und losgeschickt werden. Aber dazu muss der jeweilige Host oder Service rausgesucht werden. Diese Aufgabe kann auch eleganter über die REST-API von Icinga 2 angestoßen werden.
Ein kleines Skript und schon gehts von der Kommandozeile:

#!/bin/bash
#
unset ftp_proxy
unset http_proxy
unset https_proxy
apiuser="myuser"
apipasswd="mypasswd"
server="localhost"
while getopts h:s: opt
do
  case "$opt" in
    h) host=$OPTARG ;;
    s) service=$OPTARG ;;
    h) Usage
       exit 1 ;;
    ?) echo "ERROR: invalid option" >&2
       exit 1 ;;
  esac
done
shift $((OPTIND - 1))
if [ -n "${service}" ] ; then
  # Bitte in eine Zeile zusammenfassen
  curl -k -s -u "${apiuser}:${apipasswd}" -H 'Accept: application/json'
  -X POST 'https://'${server}':5665/v1/actions/send-custom-notification'
  -d '{ "type": "Service", "service" : "'${host}"!"${service}'", "author": "icingaadmin",
  "comment": "This is a testmessage", "force": true }' | python -m json.tool
  exit
fi
if [ -n "${host}" ] ; then
  # Bitte in eine Zeile zusammenfassen
  curl -k -s -u "${apiuser}:${apipasswd}" -H 'Accept: application/json'
  -X POST 'https://'${server}':5665/v1/actions/send-custom-notification'
  -d '{ "type": "Host", "host" : "'${host}'", "author": "icingaadmin",
  "comment": "This is a testmessage", "force": true }' | python -m json.tool
  exit
fi
root@icinga-node1:$ ./send_icinga2_message -h srv04 -s ping4
{
    "results": [
        {
            "code": 200.0,
            "status": "Successfully sent custom notification for object 'srv04!ping4'."
        }
    ]
}

In Icinga Web 2 sieht das ganze dann so aus 🙂 Wenn ihr mehr über Icinga 2 wissen möchtet, kommt einfach auf uns zu.
bildschirmfoto_2016-09-16_16-27-16bildschirmfoto_2016-09-16_16-28-28
Die Notification-Scripts für die in den Screenshots gezeigten Notifications basieren auf den Blogpost „Icinga 2 + Director + Notifications = <3“ von Marianne Spiller.

Jabber-Notifications mit Icinga 2

Um mit Icinga 2 einfach Notifications an Jabber-Kontakte senden zu können, habe ich mir folgendes Script geschrieben:

#!/usr/bin/env python
import xmpp, os, sys
if len(sys.argv) < 3:
    print "Syntax:", sys.argv[0], " "
    sys.exit(1)
jid = xmpp.protocol.JID(os.environ["XMPP_USER"])
cl = xmpp.Client(jid.getDomain(), debug = [])
con = cl.connect()
cl.auth(jid.getNode(), os.environ["XMPP_PASSWORD"])
cl.sendInitPresence()
msg = xmpp.Message(sys.argv[1], sys.argv[2])
msg.setAttr('type', 'chat')
cl.send(msg)

Das Script wird dabei in /etc/icinga2/scripts mit dem Dateinamen jabber-notification.py abgelegt werden. Zusätzlich muss noch die Python-XMPP-Library installiert werden, für die es z.B. in Debian das Paket python-xmpp gibt.
Um das Script mit Icinga verwenden zu können, müssen zunächst folgende allgemeine Templates definiert werden:

template NotificationCommand "jabber-template" {
  import "plugin-notification-command"
  command = [
    SysconfDir + "/icinga2/scripts/jabber-notification.py",
    "$xmpp_recipient$",
    "$xmpp_message$"
  ]
  vars.xmpp_recipient = "$jabber$"
  // Wir übergeben den Benutzernamen und das Passwort per Environment-
  // Variablen an das Script, damit diese nicht per ps(1)
  // für andere Benutzer einsehbar sind.
  env = {
    XMPP_USER = "$xmpp_user$"
    XMPP_PASSWORD = "$xmpp_password$"
  }
}
template NotificationCommand "jabber-host-notification" {
  import "jabber-template"
  vars.xmpp_message = {{{Notification Type: $notification.type$
Host: $host.display_name$
Address: $address$
State: $host.state$
Date/Time: $icinga.long_date_time$
Additional Info: $host.output$
Comment: [$notification.author$] $notification.comment$}}}
}
template NotificationCommand "jabber-service-notification" {
  import "jabber-template"
  vars.xmpp_message = {{{Notification Type: $notification.type$
Service: $service.name$
Host: $host.display_name$
Address: $address$
State: $service.state$
Date/Time: $icinga.long_date_time$
Additional Info: $service.output$
Comment: [$notification.author$] $notification.comment$}}}
}

Den beiden Templates "jabber-host-notification" und "jabber-service-notification" fehlen dabei noch die Custom Attribute für den Jabber-Benutzernamen und -Passwort. Um diese anzugeben, definieren wir zwei Commands:

object NotificationCommand "jabber-host-netways" {
  import "jabber-host-notification"
  vars.xmpp_user = "jabber-user@example.org"
  vars.xmpp_password = "passwort"
}
object NotificationCommand "jabber-service-netways" {
  import "jabber-service-notification"
  vars.xmpp_user = "jabber-user@example.org"
  vars.xmpp_password = "passwort"
}

Anschließend können wir diese Commands für Notifications verwenden:

object User "gunnar" {
  vars.jabber = "gunnar@beutner.name"
}
apply Notification "jabber-host" to Host {
  command = "jabber-host-netways"
  users = [ "gunnar" ]
  assign where true
}
apply Notification "jabber-service" to Service {
  command = "jabber-service-netways"
  users = [ "gunnar" ]
  assign where true
}

Die Command-Templates sind dabei so parametrisiert, dass in den einzelnen Notifications bei Bedarf auch die Texte für die Jabber-Messages über das Custom-Attribut xmpp_message überschrieben werden können.