Das ganze Hardware-Drama die letzte Zeit hat mich dazu bewogen, etwas anzufangen, was ich mir eigentlich schon seit (beinahe :)) drei Jahren wünsche: Ein zeitgemäßes Servermonitoring bei $AG.
Hängengeblieben bin ich dann bei Zabbix, die Inbetriebnahme war so weit so schmerzlos (fertige Pakete in den Repos von Debian Etch und Lenny sowie CentOS 5.3), die grundsätzliche Konfiguration ist recht simpel und straightforward**, wobei ich bei weitem noch nicht die Möglichkeiten der Software ausnutze, an sich teste ich nur ob sich ein Server in die ewigen Jagdgründe verabschiedet hat und generiere daraus Panikbenachrichtigungen***. Sicher wäre das schneller mit einer Handvoll selbstgestrickten Skripten gegangen, aber ich wollte eine Lösung einführen, auf die ich langfristig aufbauen kann. NICHTS hält länger als ein Provisorium…
Das einzige wirklich fehlende war dann noch die Überwachung vom Überwachungsserver selbst – das ganze Ding soll dazu dienen, dass ich seit Wochen mal wieder in Ruhe schlafen kann ohne mich in Albträumen über abkackende Server zu stürzen; somit ist klar, dass ich auch den Wächter überwachen muß.
Prinzipiell lassen sich Zabbix-Server-Instanzen auch kaskadieren, aber für meine kaum 3 Dutzend Server wäre es absoluter Overkill, gleich zwei Zabbixe zu betreiben (und dann immer noch nicht mitkriegen, wenn der Strom ausfällt…), damit mußte etwas einfacheres her.
Was ich jetzt habe ist ein dreistufiges Monitoring:
1. Zabbix überwacht aktiv alle internen Server (entweder über den Agent-Dienst auf den Servern oder – wenn der nicht installierbar ist – ganz simpel von außen über Ping und offene Ports)
2. Auf dem Mailserver (auch im internen Netz) läuft per cron ein simples Skript, das den Zabbix-Agent auf dem Zabbix-Server abfragt (sinnigerweise nach der Anzahl laufender zabbix_server-Prozesse :)), Herzstück des ganzen ist das:
echo -e „proc.num[zabbix_server]“\n\n; sleep 5) | telnet [Zabbix-Server] 10050 2>&- | cut -s -d D -f 2 | cut -b 9-
Damit wird nur per Telnet auf dem Port 10050 (der Default bei Zabbix Agents) ein Item abgefragt, in diesem Fall die Anzahl laufender Prozesse mit dem Name „zabbix_server“. Der Rest dient nur dazu, die Ausgabe vom Zabbix-Agent in nutzbare Form zu bringen, die Ausgabe vom Telnet-Teil sieht ungefähr so aus:
Trying [IP-Adress]…
Connected to [Zabbix-Server].
Escape character is ‚^]‘.
ZBXD[ein paar Byte Binärschlonz]23
Das erste cut wirft die ersten 3 Zeilen raus (der Trenner „D“ ist ja nicht vorhanden) und splittet die vierte Zeile, Ergebnis ist dann [Binärschlonz]23. Das zweite cut erlöst mich dann noch von dem Zabbix-Protokoll-eigenen paar Bytes nichtdruckbare Zeichen und ich habe ein einfache Integerzahl. Und mit der lässt sich in einem Skript schon einiges anstellen :) Meine Benachrichtigungen habe ich dann so definiert, dass alles von >0 gut ist, kriege ich als Ergebnis eine 0 (kein laufender Zabbix-Server-Prozess) oder irgendwas anderes (ein leeres Ergebnis heißt, dass keine Verbindung aufgebaut werden konnte beispielsweise) stimmt was nicht und die Paniknachricht wird generiert.
3. Auf einem angemieteten Server bei $großemHostingAnbieter haben wir noch einen root-Server laufen, der fragt dann über ein ähnlich simplen Bash-Skript ab, ob Port 25 (=smtp) auf der externen Adresse von unserem Netz erreichbar ist.
So ist im großen und ganzen eine lückenlose Überwachung möglich, der Zabbix-Server selbst überwacht alle meine internen Boxen, der Mailserver hat ein Auge auf die Zabbix-Box und ein Rechner draußen in der Wolke bewacht den Mailserver. Nicht 100%ig valide, aber für die SLAs von uns (und meinem Schlaf :)) reicht das erst mal.
*) sorry wenn jemand was politisches erwartet hat, aber was sollte ich dem noch hinzufügen können?
**) im großen und ganzen, allerdings scheint sich das Übertragungsformat zwischen V 1.1.4 (bei Etch) und V 1.4.6 (Lenny) ziemlich geändert zu haben, für ein paar obskurere Monitoring-Sachen auf einigen Servern war ich gezwungen das Source-DEB von Lenny unter Etch neu zu backen
***) auch die sind so simpel wie möglich gestrickt: Es werden Mails an $großenFreemailProvider generiert und von da aus per Filter auf Absender und Betreff per SMS-Benachrichtigung an mich weitergeleitet