Checkmk: Notifications per Telegram empfangen
Alarme per SMS oder Mail sind gut und schön, aber man hat sich doch an Messenger gewöhnt, oder? Und mit Telegram ist es auch gar kein Problem Notifications von Checkmk direkt dort zu empfangen. Hier geht es um eine Minimallösung mit möglichst wenig Aufwand - etwas Demo-Code aus dem Handbuch und einer einzigen Zeile Bash-Code.
Vorgehen und Alternativen
Gleich seht Ihr Schritt für Schritt, wie Ihr Alarmierungen in Form einer Textdatei in einem Telegram-Chat empfangt. Zur Demonstration genügt hier tatsächlich das Beispiel-Alarmierungsskript aus dem Checkmk-Handbuch: Bei Alarmierung wird eine Textdatei mit den Daten zum Ereignis lokal gespeichert. Mit einer weiteren Zeile wird diese Datei dann an Telegram gesendet.
Es geht aber auch komfortabler: Im Netz gibt es einige Alarmierungsskripte, die statt einer Datei gleich sauber formatierte Infos verschicken - grundsätzlich ist die Vorgehensweise aber identisch. Ein solches Skript findet Ihr beispielsweise hier bei Checkmk-Trainer Karl Deutsch, der auch eine Anleitung für Threema hat. Generell ist es nicht schwierig, statt einer Datei Text zu versenden, macht aber doch ein paar Zeilen mehr Code.
1. Telegram-Bot erstellen
Tja, das fängt gut an: Zunächst benötigt Ihr einen Telegram-Bot samt zugehörigem API-Token für den Zugriff. Wie das geht, zeigen wir Euch hier im Detail. Die Anleitung zeigt ebenfalls, wie mit dem Token Texte und Dateien an Telegram verschickt werden. Sofern Ihr mit Checkmk und den Notifications eh vertraut seid, steckt die eigentliche Info eher dort.
2. Alarmierungsskript schreiben
Ein gültiges Alarmierungsskript benötigt im Grunde nur einen Titel und eine einzelne Befehlszeile. Aber um den Blick auf das Handbuch zu lenken, kopiert einfach den Beispielcode, packt ihn in eine Datei /omd/sites/MYSITE/local/share/check_mk/notifications/foobar und ergänzt ihn um die curl-Zeile zu folgendem Gesamtkunstwerk:
#!/bin/bash
# Foobar Teleprompter
env | grep NOTIFY_ | sort > $OMD_ROOT/tmp/foobar.out
curl -X POST "https://api.telegram.org/bot123456:ABCDE/sendDocument" -F chat_id=-1234567890 -F document="@/omd/sites/mysite/tmp/foobar.out"
echo "Successfully written $OMD_ROOT/tmp/foobar.out"
exit 0
Zunächst werden über env die dem Skript übergebenen Variablen ausgelesen, mit grep nach NOTIFY_ gefiltert und dann sortiert in die Datei foobar.out geschrieben.
In der curl-Zeile wird nun der aus dem Telegram-Bot-Workshop bekannte Datei-Senden-Aufruf genutzt, um eben jene foobar.out an den angegebenen Chat zu senden. Achtet auf das @ vor dem Pfad - das vergisst man schnell ;)
Anschließend speichern und mit chmod +x foobar ausführbar machen, fertig.
Und genau an dieser Stelle könntet Ihr im Skript natürlich mehr machen: Zum Beispiel den grep-Filter verfeinern, einzelne Daten in Variablen speichern, Texte aus Variablen direkt in Telegram ausgeben und so weiter - eben die Feinheiten, die Euch gegebenenfalls Skripte aus dem Netz abnehmen.
3. Alarmierungsregel erstellen
Erstellt nun über WATO|Notifications eine neue Alarmierungsregel und setzt dort als Notification Method Euer Skript, das als Foobar Teleprompter auftauchen sollte. Alle sonstigen Optionen könnt Ihr ignorieren. Sofern mehrere Nutzer existieren, solltet Ihr vielleicht zum Testen noch einen Filter auf einen bestimmten Empfänger setzen.
4. Versand testen
Zum Testen könnt Ihr wie gewohnt eine Seite mit Services aufrufen und irgendetwas über die Kommandos künstlich auf Critical setzen ...
... und schon sollte die Datei in Eurem Telegram-Chat landen.
Die Ausgabe umfasst hier ganze 106 Zeilen - es lohnt sich also, etwas präziser als per grep NOTIFY_ zu filtern.
5. Troubleshooting
Wenn die Alarmierung nicht klappt gibt es viele Optionen, die dafür verantwortlich sein könnten - allesamt zu finden hier im Handbuch. Zudem könnt Ihr schauen, ob sich das Skript manuell ausführen lässt, ob die Datei foobar.out tatsächlich geschrieben wird, ob der Versand mit Telegram generell funktioniert (am besten mit Text statt einer Datei testen) und natürlich, ob Konfiguration und Agents aktuell sind.