Nagios is een goed product om je omgeving mee te monitoren. Het is een flexibele en veelzijdige oplossing, die een beheerder veel werk uit handen neemt en onder andere een overzicht van de omgeving toevoegt in de vorm van een website. Nagios wordt breed gedragen en er bestaan al veel plugins om diverse controles uit te voeren. Wanneer er een controle gewenst is op een stuk hard- of software waar nog geen plugin voor bestaat, dan kan men deze zelf schrijven . Dit laatste beschrijven we in dit artikel in een notendop!

Afstand nemen

Voordat je een plugin gaat schrijven is het goed om eerst goed te studeren op wat je er precies mee wilt. Welke (on)gebruikelijke situaties wil je er eigenlijk mee controleren? Vergeet hierbij niet dat je normaal gesproken geen meldingen wilt zien, omdat meldingen alleen bij uitzonderlijke situaties moeten verschijnen.

Raadpleeg altijd de documentatie van de hard- of software die je wilt monitoren en doe vooral geen aannames. Waar staat de informatie die je wilt opvragen en hoe kun je deze raadplegen? Staat de benodigde informatie op een website die je moet opvragen, is de informatie beschikbaar via SNMP, of kun je deze op een andere manier achterhalen? Afhankelijk van de situatie waarin je je begeeft en jouw eigen eisen en wensen, bepaal je de manier waarop je de informatie ontsluit.

In het volgende voorbeeld gaan we er vanuit dat de benodigde informatie op een website gepubliceerd staat die we automatisch door een zelf geschreven Nagios-plugin willen laten controleren op het jaartal in de voettekst. Je wilt immers controleren of het jaartal in de voettekst is bijgewerkt.

Programmeertaal

De eerste keuze die gemaakt moet worden is de taal waarmee je aan de slag wilt gaan. Of het nu BASH of shell scripting, Python, Perl, Java of C++ is, je hebt de vrije keuze. Kies de programmeertaal waarmee jij het beste overweg kunt. Denk hierbij ook even aan je collega's, die eventueel ook aanpassingen moeten kunnen maken aan de plugin. Het is onhandig als jij de enige bent die de plugin kan bijwerken. Dat zou namelijk betekenen dat ook het hele onderhoud op jouw schouders terechtkomt. Om deze reden kiest men regelmatig voor shell scripting.

Hoe kunnen we de benodigde informatie opvragen via de gekozen programmeertaal? Als blijkt dat de gekozen programmeertaal niet voldoet, wissel deze dan gerust in voor een andere. Gelukkig kunnen wij via shell scripting het programma 'wget' aanroepen dat de website voor ons kan ophalen. Vervolgens dienen we de website te doorzoeken naar het juiste stuk tekst en moeten we daar een actie (return code) aan koppelen.

Return codes en informatie

Nagios plugins kunnen vier typen meldingen genereren, namelijk OK (0), WARNING (1), CRITICAL (2) of UNKNOWN (3). Afhankelijk van de return code van een plugin, wordt een bepaald type melding gegenereerd. Binnen shell scripting kun je gemakkelijk via de 'exit' functie, het script stoppen en de desbetreffende code als return code teruggeven. Als je voor de 'exit' functie, een (of meerdere) tekstregels teruggeeft, dan zie je deze terugkomen als extra informatie bij de desbetreffende Nagios check.

Dit is niet noodzakelijk, maar wel heel nuttig. Je wilt immers niet alleen weten dat bijvoorbeeld een bepaalde check faalt met een CRITICAL melding, maar vooral waarom de check faalt.

Schrijven

Nu is het eindelijk tijd om de plugin te gaan schrijven. Start je favoriete editor - in ons geval is Vim - en maak je nieuwe plugin. In de broncode van de plugin verwerken we vaak minimale documentatie en de resterende documentatie leveren we in een apart bestand aan. Hieronder volgt een voorbeeld van een simpele plugin om te controleren of het jaartal van de trademark footer op www.ubuntu.com bijgewerkt is met het huidige jaar:

#!/bin/sh

#HUIDIG_JAAR=2011

# Statische variabele HUIDIG_JAAR=$(/bin/date +%Y)

# Bepaal het huidige 4-cijferige jaartal en zet deze in de HUIDIG_JAAR variabele

# Hieronder halen we de broncode van www.ubuntu.com op, zoeken de regel met 'registered trademarks' en kijken vervolgens of het huidige jaartal erin staat

if [ $(/usr/bin/wget -O- www.ubuntu.com 2>/dev/null | /bin/grep -i 'registered trademarks' | /bin/grep $HUIDIG_JAAR >/dev/null ; /bin/echo $?) -eq 0 ]

then

echo "OK: Trademark footer is up-to-date"

# Deze melding is te zien binnen nagios

exit 0

# Geef return code 0 (OK) terug

else

echo "CRITICAL: Trademark footer is out-to-date!"

# Deze melding is te zien binnen nagios

exit 2

# Geef return code 2 (CRITICAL) terug

fi

Het is verstandig om gebruik te maken van variabelen binnen het script, want variabelen zorgen ervoor dat aanpassingen in de toekomst makkelijker gemaakt kunnen worden. Daarnaast kun je opties gebruiken om op een dynamische manier waarden aan het script mee te geven. Dit zorgt ervoor dat het script flexibel blijft en dus minder onderhoud nodig heeft. In plaats van statisch het huidige jaartal op te geven, bepalen we dynamisch het huidige jaar. Hiervoor gebruiken we 'date' in combinatie met de HUIDIG_JAAR variabele. Wanneer we dit niet doen, zou je deze Nagios check elk jaar moeten aanpassen!

Testen

Vergeet niet jouw kersverse plugin grondig te testen. Schroom niet om een aantal use cases op te schrijven en deze te doorlopen. Worden de meldingen gegenereerd die je verwacht? Let bij de use cases niet alleen op de situaties die vaak voorkomen, maar ook op de uitzonderingen. Want het zou zonde zijn als je midden in de nacht wakker gebeld wordt vanwege een foutieve melding.

Koffie

De plugin is af, het zit er bijna op. Nog even de documentatie afmaken, deze toevoegen aan de plugin en je collega's inlichten over je nieuwe trots. Daarna is het tijd om de plugin te integreren binnen Nagios en deze te activeren. Je bespaart vanaf nu tijd, omdat de plugin voortaan regelmatig en vooral automatisch het zware en eentonige werk voor je doet. Tijd voor een lange en verdiende koffiepauze!

Sebastian Schauenburg is open source consultant bij ICT dienstverlener Ictivity