Realtime monitoring met Zabbix en Pushover

Zabbix is open source, realtime monitoring software. Het heeft echter één probleem: de standaard mogelijkheden tot notificaties zijn wat beperkt. Na installatie zijn de media types Email, SMS en Jabber beschikbaar. Email vereist out-of-the-box een open relay óf een smtp-server op dezelfde host, SMS vereist een seriële connectie en Jabber een xmpp-server (die niet van Google is). Kortom, ietwat beperkt. Gelukkig kan je ook custom alertscripts gebruiken.

Standaard is Zabbix (2.0.10) niet beschikbaar in Debian Wheezy. Als je geen zin hebt om zelf te compileren, kan je de ZabbixZone Repository gebruiken. Deze is ook beschikbaar voor Debian Squeeze (waar Zabbix wel in standaard in zit, maar slechts tot versie 1.8.6)

Om deze scripts te kunnen gebruiken, moet je eerst aangeven waar deze scripts gevonden (en uitgevoerd) kunnen worden. Dat doe je in zabbix_server.conf. De locatie van dit bestand is afhankelijk van de gebruikte distro, maar onder Debian kan je dit bestand vinden in /etc/zabbix/. De locatie van de scripts kan je vinden in de parameter AlertScriptsPath. Onder Debian Wheezy (mijn distro van keuze en de basis van dit artikel) is het standaard pad /usr/lib/zabbix/alertscripts/. Als je wijzigingen hebt gedaan aan de server-configuratie moet je deze wel opnieuw starten:

/etc/init.d/zabbix-server restart

De focus van dit artikel is om push-notificaties te sturen via Pushover. Hiervoor heb je een Pushover-account (gratis, kan je hier aanmaken) en de Pushover-app voor je smartphone (of tablet) nodig.

Als je eenmaal een account aangemaakt hebt bij Pushover, dien je daarna een applicatie aan te maken. Als je die hebt aangemaakt, heb behalve de API-token van de applicatie, ook de user-key nodig.

Maak een nieuw Media Type aan in Zabbix. In het veld ‘Script’ vul je de naam in van het script dat we later op de server gaan zetten. Maak daarna een nieuwe user aan. Het meest belangrijke gedeelte hiervan is het tabblad Media. Hierin geef je aan via welke media types de gebruiker kan worden bereikt. Kies het eerder aangemaakte Media Type.

In het veld ‘Send to’ vul je de volgende string in: [applicatie-token]-[user-token]. De reden dat dit één string moet zijn, is omdat Zabbix verder geen mogelijkheden biedt voor meer parameters. Het is dus zaak om de twee tokens in het script weer uit elkaar te trekken. Plaats onderstaand script in de directory voor alertscripts:

#!/bin/bash
 
# Send a Push Notification (PushOver) to a recipient
# (c) J.J. Fresco / JacobFresco.nl
 
PToken=$(echo $1 | cut -f1 -d-)
PUser=$(echo $1 | cut -f2 -d-)
PMessage=$2
 
curl -s 
-F "token=$PToken" 
-F "user=$PUser" 
-F "message=$PMessage" 
https://api.pushover.net/1/messages.json >> /pad/naar/logfile
 
# Zorg ervoor dat de logfile 'writable' is door het user die het script uitvoert!

De variabelen $1 en $2 worden door Zabbix meegegeven via de commandline als het script wordt uitgevoerd. $1 bevat de string die is ingevoerd bij ‘Send to’ voor de gebruiker, en $2 bevat de in een Action ingesteld tekst. Het script splitst de variabelen op basis van het min-teken (‘-‘), dus het is zaak dat dit het scheidingsteken is voor de twee tokens.

Wat ook van belang is, is dat het script wordt uitgevoerd door dezelfde user waarmee ook het zabbix-server-process is gestart. Op Debian-systemen is dit vrijwel altijd de gebruiker ‘zabbix‘. Om ervoor te zorgen dat het uitvoeren van het script goedgaat, moeten deze rechten goed gezet worden:

chown zabbix:zabbix /pad/naar/script.sh
chmod 644 /pad/naar/script.sh

Om zeker te zijn dat het script z’n werk doet, kan je dit testen:

su zabbix
cd /pad/naar/script/
../script.sh [applicatetoken]-[usertoken] "Test voor Zabbix en Pushover"

Als het script goed werkt, zou er een melding op de betreffende device moeten binnenkomen. Als dit niet het geval is, kan je de logfile uit het script bekijken. Een mogelijke foutmelding zou kunnen zijn dat het gebruikte usertoken niet goed is:

{"user":"invalid","errors":["user identifier is invalid"],"status":0,"request":"7157e1c49712f920778d876c033850bb"}

Als het script wel goed werkt, zal er zoiets in de logfile komen te staan:

{"status":1,"request":"50677c5e4f441215e508f9e859e72c0f"}

Als curl niet geinstalleerd is op het systeem, zal het script sowieso niet goed werken. Curl installeren doe je via apt-get:

apt-get install curl

Nu is het nog slechts een kwestie van in Zabbix een Action te configureren die gebruik maakt van het zojuist gecreëerde Media Type. Door het gebruik van custom alertscripts zijn de mogelijkheden onbeperkt. Met wat basis-bash-scripting kan je deze mogelijkheden dan nog eens flink uitbreiden t.o.v. de standaard Zabbix-parameters.

Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponShare on TumblrEmail this to someone
Jacob Fresco Geschreven door:

Techneut, van joodse afkomst, fan van Ajax, getrouwd met Claudia, papa van Lotte en Levi en lid van het erepeloton Waalsdorp

  • Francis

    Hi Jacob,

    Thanks for wonderful sharing, I follow the step and I can get the test working receive the test message on my pushover app, however it’s not trigger by zabbix because I read this post few times and make sure I have correct configuration.

    any idea?

    • Francis

      Hi Jacob, it was the selinux cause the problem, thanks

  • Martijn

    Dat was makkelijk. Wel jammer dat de Pushover API niet heel snel reageert; het request duurt meestal 2 a 3 seconden en dan duurt het nog enkele seconden voordat de push message aankomt. Desondanks is het nog steeds sneller (en hopelijk betrouwbaarder) dan het SMSje dat we nu gebruiken.