Benachrichtigungen per XMPP/ Jabber und Check_MK Flexible Notifications [Update]
26. April 2013 | Von Thorsten Robers | Kategorie: Monitoring | AvailabilityFrüher hatten wir bei unserem Nagios/ Icinga immer auch eine Benachrichtigung mittels Jabber und dem Nagibot eingerichtet. Da der Nagibot aber nicht so ohne weiteres über die Multisite und den Flexible Notifactions einzurichten ist, habe ich auf die Schnelle ein Python-Skript verfasst. Das Skript baut für die Benachrichtigung eine Verbindung zum Server auf, verschickt den Alert und beendet danach die Verbindung. Recht simple eigentlich.
Voraussetzung hier ist eine einigermassen aktuelle Check_MK_Version (> 1.2.1), die bereits die Flexible Notifications ermöglicht. Damit das folgende Benachrichtigungsskript funktioniert muss zunächst die sleekxmpp-Bibliothek für Python in einer aktuellen Version installiert werden.
pip install sleekxmpp
Danach musst du das folgende Skript unter /omd/sites/<sitename>/share/check_mk/notifcations/xmpp bzw. ~/share/check_mk/notifications/xmpp ablegen und auch ausführbar machen. Wenn das Skript nicht ausfürhbar ist, wirst du völlig vergebens in der Multisite/ WATO nach der Benachrichtigungsform suchen.
#!/usr/bin/env python # Send Notifications via XMPP import sleekxmpp import sys import os import logging import time class SendMsgBot(sleekxmpp.ClientXMPP): def __init__(self, jid, password, recipient, msg): super(SendMsgBot, self).__init__(jid, password) self.recipient = recipient logging.debug("Recipient: %s" % recipient) self.msg = msg logging.debug("Message: %s" % msg) self.add_event_handler('session_start', self.start) self.connect() self.process(threaded=False) def start(self, event): self.send_presence() self.get_roster() self.send_message(mto=self.recipient, mbody=self.msg) logging.debug("Message send") self.disconnect(wait=True) if __name__ == '__main__': logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.ERROR) message = os.environ["NOTIFY_NOTIFICATIONTYPE"]+"\n\nHost: "+os.environ["NOTIFY_HOSTNAME"]+" - "+os.environ["NOTIFY_HOSTSTATE"]+"\nPlugin-Output: "+os.environ["NOTIFY_HOSTOUTPUT"]+"\n\nService: "+os.environ["NOTIFY_SERVICEDESC"]+" - "+os.environ["NOTIFY_SERVICESTATE"]+"\nService-Plugin-Output:"+os.environ["NOTIFY_SERVICEOUTPUT"]+"\n\n\n" logging.error("%s" % message) xmpp = SendMsgBot("nagios@jabber.example.com", "kennwort" , os.environ["NOTIFY_PARAMETER_1"], message)
Um die Benachrichtigung für einen Benutzer zu aktivieren wird WATO verwendet. WATO ist Bestandteil von Check_MK und dient der Konfiguration der Überwachung und der gesamten Monitoring-Infrastruktur. Im WATO-Webinterface suchst du dir den entsprechenden Benutzer raus und schaust im Abschnitt „Notification“ (siehe folgendes Bild).
Dort klickst du auf den Button „Add Notification“. Es wird dann eine weitere Benachrichtungsform hinzugefügt, die per Voreinstellung auf Mail eingestellt ist. Generell kannst du auf diesem Wege verschiedene Benachrichtigungswege konfigurieren. Wenn du auf die Pfeilspitze vor der neuen Benachrichtigung klickst, so werden dir die Einstellungsmöglichkeiten für die Benachrichtigungsform angezeigt. Auf dem nächsten Bild siehst du, welche Auswahl du anstelle der klassischen Mail du verwenden musst.
Damit die Benachrichtigung auch beim richtigen Empfänger ankommt wird dieser als erstes „Plugin Argument“ angegeben. Das war es auch schon fast. Nach dem Speichern und der Aktivierung der Anpassungen kannst du mit einem Test der Benachrichtigung fortfahren.
Viel Spass mit der Jabber-Benachrichtigung.
[UPDATE]
Ich habe das Benachrichtigungsskript ein wenig angepasst, so das jetzt im Falle eines Hostproblems nicht mehr unsinnigerweise auch Service-Informationen ausgegeben werden.
</pre> #!/usr/bin/env python # Send Notifications via XMPP import sleekxmpp import sys import os import logging import time class SendMsgBot(sleekxmpp.ClientXMPP): def __init__(self, jid, password, recipient, msg): super(SendMsgBot, self).__init__(jid, password) self.recipient = recipient logging.debug("Recipient: %s" % recipient) self.msg = msg logging.debug("Message: %s" % msg) self.add_event_handler('session_start', self.start) self.connect() self.process(threaded=False) def start(self, event): self.send_presence() self.get_roster() self.send_message(mto=self.recipient, mbody=self.msg) logging.debug("Message send") self.disconnect(wait=True) if __name__ == '__main__': logging.basicConfig(filename='/tmp/notifications.log', format='%(asctime)s %(levelname)s:%(message)s', level=logging.ERROR) logging.debug("Start") #message = os.environ["NOTIFY_NOTIFICATIONTYPE"]+"\nHost: "+os.environ["NOTIFY_HOSTNAME"]+" - "+os.environ["NOTIFY_HOSTSTATE"]+"\nHost-Plugin-Output: "+os.environ["NOTIFY_HOSTOUTPUT"]+"\nService: "+os.environ["NOTIFY_SERVICEDESC"]+" - "+os.environ["NOTIFY_SERVICESTATE"]+"\nService-Plugin-Output:"+os.environ["NOTIFY_SERVICEOUTPUT"]+"\n-------------------------\n\n" if os.environ["NOTIFY_SERVICEDESC"] != '$SERVICEDESC$': message = "SERVICE" else: message = "HOST" message = message+"-"+os.environ["NOTIFY_NOTIFICATIONTYPE"]+"\n"+os.environ["NOTIFY_SHORTDATETIME"]+"\nHost: "+os.environ["NOTIFY_HOSTNAME"]+" - "+os.environ["NOTIFY_HOSTSTATE"] if os.environ["NOTIFY_SERVICEDESC"] == '$SERVICEDESC$': message = message+"\nHost-Plugin-Output: "+os.environ["NOTIFY_HOSTOUTPUT"] else: message = message+"\nService: "+os.environ["NOTIFY_SERVICEDESC"]+" - "+os.environ["NOTIFY_SERVICESTATE"]+"\nService-Plugin-Output:"+os.environ["NOTIFY_SERVICEOUTPUT"] message = message+"\n-------------------------\n\n" logging.debug("%s" % message) xmpp = SendMsgBot("nagios@xmpp.example.om", "kennwort" , os.environ["NOTIFY_PARAMETER_1"], message) <pre>
Hi,
habe versucht xmpp mit Deinem Script ein zu binden, aber es kommen keine Notifikationen an.
Wie und wo kann ich Prüfen, was falsch läuft?
Habe es mit beiden Versionen vom Script versucht.
Ich habe in der letzten Zeile den Absender Account eingetragen, das ist doch richtig, oder? Bitte evtl. mit in Deinen Text aufnehmen das man das noch machen muss. Evtl. am Anfang des Scripts eine Variable einbinden, das man oben im Script die Account und das PW angibt und es dann im Script genutzt wird.
Gruß,
Oliver