Zabbix Medien einrichten

Zabbix kommuniziert mit der Außenwelt

Die meisten Nutzer richten ein Monitoring-System ein, weil sie informiert werden wollen, wenn etwas aus dem Ruder läuft.

Damit Ihnen Zabbix eine Nachricht schickt, müssen Sie zwei Bereiche konfigurieren. Zuerst müssen Sie ein Medium einrichten. Das bedeutet, Sie legen den Transportweg einer Nachricht fest. Dies sind beispielsweise SMTP-Server, eine SMS-Gateway oder eine Telefonanlage. Diese Konfiguration ist schnell erledigt und ändert sich in der Regel selten.
Ob, wann und wie eine Nachricht verschickt wird, steuern die sogenannten Aktionen, denen das Kapitel [Zabbix_Aktionen_alarm_ausloesen|"Aktionen einrichten"] gewidmet ist.

Medien werden also benötigt, damit Nachrichten versendet werden können. Ohne Medien können Sie keine Aktion vom Typ "Send Message" einrichten. Richten Sie also zuerst die Medien und dann die Aktionen ein.

Über das Hauptmenü Administration|Media Types gelangen Sie in den Konfigurationsbereich der Medien.

Mit der Installation des Zabbix-Servers wird automatisch eine Beispielkonfiguration für drei Medien angelegt. Wundern Sie sich also nicht, dass auch bei einer frischen Installation die Liste der Medien nicht leer ist.

Zu den drei Standardmedien zählen E-Mail, Jabber und SMS. Diese Medien kann der Zabbix-Server ohne fremde Programme bedienen.

Möchten Sie Nachrichten über andere Medien als die drei genannten verschicken, muss die Nachricht an ein externes Programm übergeben werden. Zabbix behandelt dieses Medium dann als "Skript".

E-Mail einrichten

Klicken Sie in der Liste der Medien auf E-Mail. Es öffnet sich ein Formular mit folgenden Eingabemöglichkeiten:

Description
Ein beliebiger Name, mit dem Sie das Medium identifizieren. Wenn Sie zum Beispiel Nachrichten über verschiedene Mailserver verschicken wollen, könnten Sie in der Beschreibung hinterlegen, über welchen Server die Nachricht "rausgehen" soll. Beim Einrichten der Aktionen vom Typ "Send Message" wird in der Liste der verfügbaren Medien nur das Feld "Description" angezeigt.
Type
Zum Einrichten des Mailversandes wählen Sie E-Mail.
SMTP Server
Geben Sie an, über welchen Mailserver die Nachrichten verschickt werden sollen.
SMTP helo
Der Helo-String ist der Name, unter dem sich der Mailclient – in diesem Fall der Zabbix-Server – beim STMP-Server ausgibt. Tragen Sie hier eine Domain oder einen Hostnamen ein, für die der SMTP-Server Mails verschicken darf. Dieser Hostname muss ggf. vom Hostnamen des Zabbix-Servers abweichen. Wenn der Zabbix-Server beispielsweise den Hostnamen zabbix.example.local hat, der Mailserver aber nur für die Domain example.com Mails verschickt, sollten Sie als Helo-String zabbix.example.com verwenden.
SMTP email
Die Absenderadresse für alle Mails, die Zabbix über dieses Medium verschickt. Wenn Sie Nachrichten mit verschiedenen Absendern schicken möchten, müssen Sie mehrere Medien vom Typ SMTP anlegen und dann unterschiedliche Absender eintragen.
Connection security
Legen Sie fest, ob eine Verschlüsselte Verbindung zum SMTP-Server per Starttls oder SSL/TLS aufgebaut werden soll. (Verfügbar ab Zabbix 3.0)
Authentication
Geben Sie einen Benutzernamen und ein Passwort an, falls der SMTP-Server eine Authentifizierung verlangt. (Verfügbar ab Zabbix 3.0)
Konfiguration des SMTP-Servers zum Versenden von E-Mails

Wie Sie sehen, ist der in den Zabbix-Server integrierte SMTP-Client sehr spartanisch. Er beherrscht weder eine Authentifizierung noch eine SSL-Verschlüsselung.

In vielen Fällen ist es angebracht, den Zabbix-Server mit einem lokalen Mailserver auszustatten. Dieser Mailserver muss nur minimal konfiguriert werden, bietet dann aber entscheidende Vorteile:

  • Mails werden zwischengespeichert, und es werden erneute Zustellversuche unternommen, wenn es Probleme mit der Zustellung gibt. Zabbix verfügt über keine interne Warteschlange. Ist der SMTP-Server nicht erreichbar, wird die Mail sofort verworfen. Ein lokaler Mailserver bietet hier einen robusten und fehlertoleranten Puffer.
  • Ein lokaler Mailserver bietet mehr Funktionen bei der Weiterleitung der Mails. SMTP-Authentifizierung und SSL-Kommunikation sind dann kein Problem mehr.

Jede Linux-Distribution hat einen sogenannten MTA (Mail Transport Agent) an Bord, den Sie als SMTP-Relay konfigurieren können.

Fehler finden

Erst wenn Sie den Zabbix-Server im Debug-Modus 4 laufen lassen, protokolliert Zabbix die Zustellung oder die eventuellen Fehler beim Mailversand.

Kann der Mailserver nicht erreicht werden, finden Sie im Server-Log einen Eintrag ähnlich wie den folgenden:

In execute_action(): alertid [122] mediatype [0]
In 192.0.2.1() smtp_server:'FAIL'
Cannot connect to SMTP server [192.0.2.1] 
[*** Cannot connect to [192.0.2.1]:25 [Network is unreachable]]

Postfix als Relayhost einrichten

Wenn Sie einen externen Mailserver verwenden, welcher eine SMTP-Authentifizierung verlangt, kommen Sie um das Einrichten eines minimalen lokalen Mailservers nicht herum. Installieren Sie zum Beispiel Postfix und tragen Sie in Zabbix 127.0.0.1 als Mailserver ein. Postfix nimmt dann die Mails von Zabbix entgegen und leitet diese an einen externen Mailserver weiter. Dabei übernimmt Postfix die Authentifizierung mit Benutzernamen und Passwort.

Hier ein Beispiel von einem SUSE-System, welches Google Mail zum Versenden der Mails verwendet. Tragen Sie Folgendes in die Datei /etc/postfix/main.cf ein:

# Minimal postfix main.cf for sending mails to external relay
myorigin = zabbix@company.com
myhostname = zabbix.company.com
alias_maps = hash:/etc/aliases
mydestination = localhost
mynetworks = 127.0.0.0/8
inet_interfaces = 127.0.0.1
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
setgid_group = maildrop

#Forward mails to relay server
relayhost                       = smtp.googlemail.com
smtp_cname_overrides_servername = no

#SMTP mit SASL-Authentification verwenden
smtp_sasl_auth_enable      = yes
smtp_sasl_password_maps    = hash:/etc/postfix/smtp_auth
smtp_sasl_security_options = noanonymous
smtp_use_tls               = yes

In die Datei /etc/postfix/smtp_auth tragen Sie die Zugangsdaten von Google Mail ein.

smtp.googlemail.com your_name@googlemail.com:geheim

Damit die Änderungen aktiv werden, führen Sie noch folgende Kommandos aus:

postmap /etc/postfix/smtp_auth
/etc/init.d/postfix reload

SMS-Benachrichtigung einrichten

Der Zabbix-Server ist in der Lage, direkt und ohne Netzwerkverbindung Textnachrichten per SMS zu verschicken. Dazu wird ein GSM-Modem verwendet, welches über eine serielle Verbindung angeschlossen wird. Der Zabbix-Server kommuniziert über sogenannte AT-Kommandos mit dem Modem und verschickt so eine SMS. Leider sind passende GSM-Modems nicht sehr weit verbreitet. Hinzu kommt, dass nicht alle Modems in der Form auf die AT-Kommandos antworten, wie Zabbix es erwartet.

Das Verschicken von SMS per Modem hat den Vorteil, dass die Alarmierung auch beim Ausfall der Internetverbindung noch funktioniert. Der Nachteil ist die teilweise schwierige Inbetriebnahme der Hardware. Als Alternative zu einem GSM-Modem stehen zahlreiche Anbieter zur Auswahl, über die Sie SMS per HTTP-API verschicken können. Dies setzt dann aber eine funktionierende Internetverbindung voraus.

Die bei eBay für wenige Euro erhältlichen USB-GSM-Modems von HUAWEI und ZTE funktionieren nur mit einem Patch des Zabbix-Servers. Das GSM-Modem Siemens MC35 hingegen konnte in zahlreichen Test nicht mit dem Zabbix-Server verbunden werden. Im Kapitel "SMS-Versand" finden Sie zwei Alternativen zum SMS-Versand per Internet, für den Fall, dass Sie den Zabbix-Server-Quellcode nicht patchen wollen.

Wenn das Modem über einen "echten" seriellen Anschluss mit dem Zabbix-Server verbunden ist, wird die Hardware in der Regel über /dev/ttyS0 oder /dev/ttyS1 angesprochen. Wenn das Modem per USB angeschlossen ist, richtet der Kernel einen virtuellen seriellen Port ein. Im Falle eines per USB angeschlossenen Modems müssen Sie noch das Programm usb-modeswitch installieren. Dieses Tool verhindert sofort beim Einstecken der Hardware, dass das USB-Modem als USB-Speicher-Stick oder USB-CD-ROM erkannt und initialisiert wird.
Modem finden:

# dmesg
usb 2-2.1: Product: HUAWEI Mobile
usb 2-2.1: GSM modem (1-port) converter now attached to ttyUSB2
# ls -l /dev/ttyUSB2
crw-rw---- 1 root dialout 188, 2 Nov 19 17:01 /dev/ttyUSB2

Da der Zabbix-Server nicht mit Root-Rechten läuft, hat dieser erst einmal keinen Zugriff auf das Modem. Ändern Sie dies, indem Sie den User zabbix in eine berechtigte Gruppe hinzufügen, zum Beispiel:

adduser zabbix dialout

Modem testen

Bevor Sie das Modem im Zabbix-Server einrichten, sollten Sie testen, ob dieses per AT-Kommando Nachrichten schicken kann. Nutzen Sie dazu zum Beispiel das Terminalprogramm picocom. Führen Sie den Test nicht als Root-User durch. Werfen Sie auch einen Blick in die Dokumentation des Geräts, um die genauen Verbindungsparameter zu erfahren.

su - zabbix -s /bin/bash
picocom --baud 19200 --flow n --databits 8 /dev/ttyUSB2

Nach ein paar Sekunden sollte die Verbindung mit Terminal ready bestätigt werden. Prüfen Sie nun, ob das Modem mit dem Mobilfunknetz verbunden ist.

AT+COPS?
+COPS: 0,0,"FONIC"

Sie sollten nun den Namen des Netzbetreibers sehen. Leiten Sie dann das Senden einer Nachricht ein:

ATE1 (press Enter)
AT+CMEE=2 (press Enter)
AT (press Enter)
AT+CMGF=1 (press Enter)
AT+CMGS="4917xxxxxxxxx" (press Enter)
>Hallo das ist ein Test (press Strg+z)

Senden Sie die Nachricht mit der Tastenkombination Strg+z. Dies sollte wie folgt bestätigt werden:

+CMGS: 9
OK

Picocom verlässt man mit der Tastenkombination Ctrl+a gefolgt von Ctrl+x. Wenn dieser Test erfolgreich war, können Sie das Modem in Zabbix einrichten. Das Problem einiger Modems besteht in der Bestätigung des Nachrichtenversands. Nicht alle Modems geben +CMGS: als Antwortcode aus. Der Zabbix-Server erwartet aber genau diesen Code.

Über das Hauptmenü Administration|Mediatypes klicken Sie auf den Link "SMS". Tragen Sie nun das Device ein, welches Sie zuvor erfolgreich mit Picocom getestet haben.

Modemport angeben

Richten Sie nun eine Aktion ein, die im Reiter Operations die Option "Send only to all" oder "Send only to SMS" aktiviert hat.

Im sogenannten "Audit-Log" finden Sie Fehlermeldungen, wenn der Versand einer Nachricht gescheitert ist.

Provozieren Sie einen Alarm, der die entsprechende Aktion auslöst. Schauen Sie nach, ob die SMS verschickt wurde. Im Hauptmenü Administration|Audit wählen Sie rechts oben im Dropdown-Menü "Actions" aus. Falls die SMS nicht angekommen ist, sehen Sie hier die möglichen Fehler. Häufig antwortet das Modem nicht so, wie Zabbix es erwartet. Sie finden dann Meldungen wie zum Beispiel:

Expected [+CMGS: ] received []
Expected [OK] received []
Expected [+CMGS: ] received [> > > > > > > > > > > > > > +CMS ERROR: 305] # (305 - invalid text mode parameter)

Im Falle der HUAWEI- und ZTE-USB-Modems wird die SMS dreimal verschickt und immer mit dem Status "not sent" protokolliert. Ursache für dieses Verhalten ist der Bestätigungscode des Modems, nachdem die Nachricht verschickt wurde. Der Zabbix-Server erwartet die Zeichenfolge +CMGS:. Wie man aber bei Tests mit Picocom feststellen kann, antworten die Modems zuerst mit einer leeren Zeile und dann mit +CMGS:. Wenn Sie den Zabbix-Server so patchen, dass die Antwort des Modems ignoriert wird, funktioniert der SMS-Versand.

Modem-Kommunikation im Zabbix-Server patchen

In der Datei src/libs/zbxmedia/sms.c ist ab Zeile 184 festgelegt, welche AT-Kommandos der Zabbix-Server an das Modem sendet und mit welcher Zeichenfolge das Modem ein Kommando bestätigen muss.
Das Original sieht so aus:

 zbx_sms_scenario scenario[] =
        {
                {ZBX_AT_ESC     , NULL          , 0},   /* Send <ESC> */
                {"AT+CMEE=2\r"  , ""/*"OK"*/    , 5},   /* verbose error values */
                {"ATE0\r"       , "OK"          , 5},   /* Turn off echo */
                {"AT\r"         , "OK"          , 5},   /* Init modem */
                {"AT+CMGF=1\r"  , "OK"          , 5},   /* Switch to text mode */
                {"AT+CMGS=\""   , NULL          , 0},   /* Set phone number */
                {number         , NULL          , 0},   /* Write phone number */
                {"\"\r"         , "> "          , 5},   /* Set phone number */
                {message        , NULL          , 0},   /* Write message */
                {ZBX_AT_CTRL_Z  , "+CMGS: "     , 40},  /* Send message */
                {NULL           , "OK"          , 1},   /* ^Z */
                {NULL           , NULL          , 0}
        };

Ändern Sie diesen Block wie folgt. So erreichen Sie, dass der Zabbix-Server nach dem Übergeben der Nachricht an das Modem auf keine Rückmeldung wartet.

 zbx_sms_scenario scenario[] =
        {
                {ZBX_AT_ESC     , NULL          , 0},   /* Send <ESC> */
                {"AT+CMEE=2\r"  , ""/*"OK"*/    , 5},   /* verbose error values */
                {"ATE0\r"       , "OK"          , 5},   /* Turn off echo */
                {"AT\r"         , "OK"          , 5},   /* Init modem */
                {"AT+CMGF=1\r"  , "OK"          , 5},   /* Switch to text mode */
                {"AT+CMGS=\""   , NULL          , 0},   /* Set phone number */
                {number         , NULL          , 0},   /* Write phone number */
                {"\"\r"         , "> "          , 5},   /* Set phone number */
                {message        , NULL          , 0},   /* Write message */
                {ZBX_AT_CTRL_Z  , NULL          , 40},  /* Send message */
                {NULL           , NULL          , 1},   /* ^Z */
                {NULL           , NULL          , 0}
        };

Kompilieren Sie anschließend den Zabbix-Server neu und kopieren Sie nur die geänderte Zabbix-Server-Binary.

/usr/src/zabbix-<VERSION>#
make
/etc/init.d/zabbix-server stop
cp src/zabbix_server/zabbix_server /opt/zabbix/sbin/
/etc/init.d/zabbix-server start

Sie reduzieren mit diesem Eingriff die Zuverlässigkeit der Nachrichtenzustellung erheblich. Der Zabbix-Server prüft nicht mehr, ob das Modem die SMS verschickt hat, und wird dementsprechend keine weiteren Versuche der erneuten Zustellung unternehmen. Wenn Sie den Zabbix-Server über ein externes RPM- oder DEB-Repository installiert haben, sollten Sie vom Patchen des Quellcodes Abstand nehmen. Bei jedem Update geht der Patch verloren und muss erneut durchgeführt werden. Wenn Sie SMS mit einem Modem verschicken möchten, verwenden Sie besser den Gammu-SMSD.

Eigene Medien hinzufügen

Neben den genannten Standardmedien können Sie beliebige andere Programme oder Skripte zum Versenden von Nachrichten verwenden.

Damit Sie eigene Skripte als Medium verwenden können, müssen Sie dies zuerst in der Konfigurationsdatei zabbix_server.conf aktivieren. Zabbix ruft die Skripte nur in einem bestimmten Ordner auf. Stellen Sie also sicher, dass die Option AlertScriptsPath nicht auskommentiert ist und dass der angegebene Ordner Ihren Vorstellungen entspricht. Starten Sie den Zabbix-Server neu, nachdem Sie Änderungen an der Konfigurationsdatei vorgenommen haben.

### Option: AlertScriptsPath
#       Location of custom alert scripts
#
# Mandatory: no
# Default:
AlertScriptsPath=/opt/zabbix/alertscripts/

Legen Sie ein Skript im zuvor eingerichteten Ordner an. Achten Sie darauf, dass der Benutzer zabbix den Ordner lesen und das Skript ausführen darf.
Wenn der Zabbix-Server ein Skript zum Versenden von Nachrichten aufruft, werden diesem drei Parameter in der folgenden Reihenfolge übergeben:

Empfänger
Es wird das übergeben, was der Benutzer in seinem Profil als "Send To" für dieses Medium eingetragen hat. In der Regel handelt es sich um E-Mail-Adressen oder Telefonnummern.
Betreff
Es wird der als "Subject" in der Aktion hinterlegte Text übergeben.
Nachricht
Es wird der als "Message" in der Aktion hinterlegte Text übergeben.

Beispiel: Legen Sie folgendes Skript zum Beispiel in der Datei /opt/zabbix/alertscripts/testalert.sh an und machen es ausführbar.

#!/bin/bash
TO=$1
SUBJECT=$2
MESSAGE=$3
OUT=/tmp/testalert.log

date>$OUT
echo "Sending to $TO">>$OUT
echo "Subject: $SUBJECT">>$OUT
echo " ">>$OUT
echo $MESSAGE>>$OUT

Skripte einbinden
Nachdem Sie ein Skript angelegt haben, müssen Sie dieses noch über die Weboberfläche als Medium einbinden. Wechseln Sie über das Hauptmenü in den Bereich Administration|Media Types und klicken Sie oben rechts auf Create Media Type.

Als Typ wählen Sie Script aus. Als Name tragen Sie einen beliebigen Namen ein, über den Sie das Skript später in den Aktionen identifizieren. Im "Feld Script" Name tragen Sie den exakten Namen der Datei ein. Diese Datei wird im konfigurierten Ordner für die Alert-Skripte ausgerufen. Absolute Pfade sind also nicht zulässig. Fügen Sie nun die drei Skriptparameter hinzu und tragen Sie die folgenden Macros ein: {ALERT.SENDTO}, {ALERT.SUBJECT} und {ALERT.MESSAGE}.

Hinzufügen eines eigenen Skriptes als Medium zum Versenden von Nachrichten

Nachdem Sie das Skript hinzugefügt haben, können Sie es in den Menüs zum Einrichten von Aktionen auswählen. In der Benutzerverwaltung können Sie jetzt für jeden Benutzer eine Empfängerkennung (Mailadresse, Telefonnummer etc.) für das neue Medium hinterlegen.

Ein häufiger Fehler beim Einrichten von Alert-Skripten sind falsche Berechtigungen. Zabbix führt die Skripte nicht mit Root-Rechten aus. Falls Ihr Skript eine Logdatei schreibt, muss der Zabbix-User auch für diese Logdatei Schreibrechte haben. Oft werden Skripte als Root-User angelegt und getestet. Durch den ersten Test gehört die Logdatei dann Root. Zabbix kann das Skript dann u.U. nicht korrekt ausführen.
Wenn Sie Nachrichten über ein eigenes Skript verschicken, wertet der Zabbix-Server weder den Exit-Code noch die Fehlermeldungen des Skriptes aus. Auch wenn sich das Skript mit Exit-Code 1 beendet, wird die Nachricht im Zabbix-Server als zugestellt protokolliert. Bauen Sie in Ihre Skripte ein Logging ein und senden Sie fehlgeschlagene Zustellversuche beispielsweise per Zabbix-Sender wieder zurück an Zabbix.