Mit Ansible lassen sich viele Linux-Server gleichzeitig bedienen und auch überwachen. Üblicherweise wird Ansible dafür eingesetzt, um z. B. Updates aus der Ferne einzuspielen. Doch das Potenzial ist viel größer. Vor allem kann man Ansible auch für die Massenüberwachung von Linux-Servern einsetzen. Zum Beispiel kann man damit Sensoren in PRTG einsparen, indem ein Linux-Server mit Ansible als Sprungbrett verwendet wird.
Damit man das Ganze überhaupt per PRTG überwachen kann, muss ein Shellscript unter /var/prtg/scripts vorhanden sein. Das kann man dem Handbuch von PRTG entnehmen.
In meinem Beispiel möchte ich alle Debian GNU/Linux-Server auf ihre Kernel-Version überprüfen. Ansible bietet dafür zwar bereits einen Standard-Check und -Filter an (Danke für den Tweet, Rasputin), doch ich möchte nicht nur wissen, welcher Kernel aktuell ausgeführt wird, sondern auch, ob es der neueste, installierte Kernel ist, der ausgeführt wird.
Ich möchte also uname -r mit dpkg -l vergleichen. Und so sieht das Skript aus:
#!/bin/bash
e=0
c=0
txt=""
for l in $(ansible Debian -m shell -a 'latest=$(dpkg -l | grep linux-image | grep -v meta | sed "s/ \+/ /g" | cut -d" " -f2 | sort | tail -n 1 | sed "s/linux-image-//"); echo "| $(uname -r) | $latest"' -o | sed 's/ | /|/g' | cut -d'|' -f1,5,6)
do
h=$(echo $l | cut -d'|' -f1)
r=$(echo $l | cut -d'|' -f2)
n=$(echo $l | cut -d'|' -f3)
if ! [ "$r" == "$n" ]
then
e=1
c=$(($c+1))
txt="$txt$h ($r / $n) "
fi
done
if [ "$txt" == "" ]
then
txt="OK"
fi
echo "$e:$c:$txt"
exit $e
Die Ausgabe, wenn Maschinen nicht die neueste installierte Kernel-Version ausführen, sieht folgendermaßen aus:
1:2:web (3.16.0-6-amd64 / 3.16.0-7-amd64) blog (3.16.0-5-amd64 / 3.16.0-7-amd64)
Und wenn alle aktuell sind, so:
0:0:OK
Dieses Ausgabeformat kann von PRTG ausgewertet werden und der Sensor ist auch aussagekräftig, weil man genau sieht, welcher Linux-Host nicht den neuesten, installierten Kernel ausführt.
In PRTG fügt man nun einen neuen Sensor hinzu: SSH-Skript. In den Sensoreinstellungen werden automatisch alle vorhandenen Shellscripts unter /var/prtg/scripts auf dem Zielhost aufgelistet. Man kann auch Parameter übergeben – das ist in diesem Beispiel nicht notwendig. Allerdings dauert die Ausführung etwas länger, sodass ich die Zeitüberschreitung für die Ausführung auf 120 Sekunden gesetzt habe. Außerdem muss der Check nicht so oft laufen. Bei mir läuft er jede Stunde.
Das Ergebnis sieht dann etwa so aus: