Seite wählen

NETWAYS Blog

Zurück in die Zukunft: Icinga2-Benachrichtigungen mit XMPP

Der klassische Weg um Benachrichtigung an Nutzer zu verschicken ist bei Icinga 2 (wie bei so vielen anderen Systemen auch) das Versenden einer Email. Für zeitnahe und mobilere Benachrichtigung gibt es den Versands von SMS, Sprachanrufe oder andere Optionen.

Mit dem Aufkommen und der starken Verbreitung von Chat-Diensten ist die Einbindung eines solchen Benachrichtigungsfunktion der offensichtliche nächste Schritt (oder zumindest eine tolle Spielerei). So gibt es Skripts für Slack Rocket Chat, Matrix, Telegram, selbstverständlich IRC und gerüchteweise auch Iridium. Wie man aus der Überschrift entnehmen kann geht hier es hier dann um einen weiteren Dienst, nämlich XMPP/Jabber (Jabber ist der alte Name des Protokolls).

XMPP ist ein freier Standard, erweiterbar und es gibt zahlreiche Implementierungen für Server und Clients. Der allgemeine Bekanntheitsgrad ist eher gering, obwohl der Einsatzbereich sehr groß ist. Zahlreiche größere Internetfirmen haben ihre Nachrichtenaustauschfunktionalität zu Beginn schlicht auf XMPP aufgebaut und mit freier Software umgesetzt (und dann natürlich einen „walled garden“ um die Nutzer gebaut). Die Kommunikation verläuft ähnlich wie Email, ein Client (ein Nutzer bzw. sein(e) Endgerät(e)) verbindet sich mit einem Server und übergibt diesem eine Nachricht; diese wird dann zu dem Zielserver transportiert, welcher sie dann an den Empfänger weiterleitet. Ähnlich wie bei Email ist es ein föderiertes System, prinzipiell kann jeder sich einen XMPP-Server aufsetzen und mit allen anderen reden. Dementsprechend wird ein Nutzer auch durch eine JID identifiziert, die aus einem Nutzername und einem Domänenteil in der Form nutzer@domaene.tld besteht.

Es gibt nun drei Gründe für die Benachrichtigung via XMPP:

  1. Ganz generell ist ein zweiter Kanal sinnvoll, da der erste Kanal ausfallen kann. Sollte das Mailsetup ausfallen, kann niemand darüber per Email benachrichtigt werden und natürlich wären alle weiteren Benachrichtigungen ebenfalls nicht mehr möglich.
  2. XMPP ist ein sehr mächtiges vielfältiges Protokoll und kann einen Nutzer zeitnah auf einem quasi beliebigen Endgerät erreichen (vorausgesetzt dieses Endgerät ist in irgendeiner Form online, Stichwort: PUSH-Nachrichten). Zusätzlich kann eine XMPP-Infrastruktur in einer beliebigen Größenordnung selbst betrieben werden ohne sich weitere externe Abhängigkeiten ins Haus zu holen.
  3. Der Autor dieses Artikel ist ein XMPP-Fan und würde gerne ein wenig Werbung dafür machen. Auch als Alternative zu den populären proprietären IM-Lösungen fragwürdiger Unternehmen.

Was die Umsetzung angeht, so gibt es hier schon genug Vorlagen, unter anderem diesen Artikel aus gleichem Hause, welcher das Thema zwar abdeckt, aber nach sechs Jahren doch auch ein Update verdient. Zwei Punkte bedürfen im besonderen einer Aktualisierung:

  1. Der Wechsel von Python2 auf Python3
  2. Die eingesetzte XMPP-Bibliothek hat etwas Rost angesetzt

Aus diesem Grund wurde auch diese Variante entwickelt, aber die Verwendung von Umgebungsvariablen für die Übergabe von sensiblen Daten ist im Moment bei der Verwendung des Directors nicht möglich. Zusätzlich wird die sleekxmpp-Bibliothek mittlerweile nicht mehr weiterentwickelt oder gewartet. Diese und weitere Anpassungen  wurden in diese Version  integriert um die sich dann auch dieser Artikel dreht.

Wenn man nun XMPP-Benachrichtigungen von dem eigenen Icinga 2-System erhalten möchte, benötigt man vorher schon die Möglichkeit XMPP-Nachrichten zu versenden, also mindestens einen Account bei einem Anbieter entsprechender Infrastruktur, beispielsweise einer von conversations.im oder jabber.at. Alternativ kann auch eine eigene Infrastruktur erstellt werden. Zur Installation des Skriptes müssen zuerst die Abhängigkeiten erfüllt werden, was in den meisten Fällen durch die Installation von Python3 mit Standardbibliotheken und der Bibliothek slixmpp abgeschlossen sein sollte. Dann muss das Skript selbst an einen passenden Ort kopiert werden und die Konfiguration aus dem Ordner icinga2_config in die eigene Konfiguration integriert werden. Besonders ist hier natürlich das Eintragen des Pfads zum Skript, dem|den eigenen XMPP-Account(s) (sowohl des Senders als auch des Empfängers) und des Passworts. Alternativ kann die Konfiguration auch mit dem Director erstellt werden.

Das ganze sieht dann beispielsweise in Conversations so aus:

Das Ganze ist noch recht minimalistisch und hilfreiche Ideen|Vorschläge|Kritik sind herzlich willkommen. Dann bleibt an dieser Stelle nicht viel mehr übrig als zu hoffen, dass dies hier jemandem nützt, was übrigens auch gerne mal kurz als Feedback gegeben werden kann 🙂

Lorenz Kästle
Lorenz Kästle
Consultant

Lorenz hat seinen Bachelor der Informatik an der FAU gemacht und sich zuletzt mit Betriebssystemen dort beschäftigt. In seiner Freizeit beschäftigt er sich ein wenig mit XMPP und der Programmiersprache Erlang.

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.

Jitsi – aka SIP Communicator

Der heutige Post ist recht kurz und bündig, aber mit gutem Inhalt gefüllt. Wir möchten Euch einen der zahlreichen Chat und Telefon Clients vorstellen, welcher sich in der Praxis gut bewährt hat und wohl die aktuell gängigsten Protokolle unterstützt. Die Rede ist von Jitsi oder auch bekannt als SIP Communicator.
Dieser dient nicht nur als Chat Client für IRC, Jabber, Facebook und CO, sondern kann dank SIP auch gleichzeitig mit als Soft-Phone genutzt werden. Zusammen mit dem Bezug auf Mikrofon und auch Kamera lässt sich das ganze auch noch weiter aufbessern und z.B. in einen Jabber Server mit Openfire als Videokonferenz Tool einbinden.
Wer also auf der Suche nach einem neuen Client ist, kann sich hier einmal ausprobieren. Und Open-Source typisch ist er sogar für alle Plattformen erhältlich.