==============
== morph.sh ==
==============
Einfach mal was mit Holz machen.

Sysadmin Tinkering: selbstgebautes IoT-Serverraum-Thermometer mit Icinga2-Integration

sysadmin serverroom nodemcu arduino making

Warum?

Vor kurzem ist die Klimaanlage in meinem Serverraum ausgefallen und die Zeit, bis ich das festgestellt habe, war eindeutig zu lang - bisher wurde die Temperatur im Serverraum nicht überwacht, und so oft bin ich dann auch nicht da unten… Schlussendlich ist nichts schlimmes passiert und es musste nur etwas Kühlflüssigkeit nachgefüllt werden, danach war alles wieder gut. Trotzdem eine blöde Situation, die ich nicht nochmal haben will. Also habe ich nach einer Monitoring-Lösung gesucht, aber die meisten Optionen wieder verworfen:

  • Kommerzielle Datacenter-Monitoring-Produkte: zu teuer
  • “Smart” Thermometer mit App: zu unflexibel, vendor lock-in, funktioniert nur im Office-Netzwerk
  • Klassisches Funkthermometer: alertet nicht, muss manuell überwacht werden

Also habe ich mich für ein kleines Bastelprojekt entschieden - yay! - und an einem unstressigen Nachmittag selbst eine Lösung gebaut. Die Schönheit an der Sache ist, dass diese Lösung extrem simpel ist, in unser Icinga2-Monitoring eingebunden werden kann (also genau dort Alarme wirft, wo man es erwartet) und zumindest in den Materialkosten sehr günstig war. Neben Icinga2 sollte das Plugin genauso für Icinga1 und Nagios funktionieren.

Wie?

Die Idee: ein Thermometer aus dem Bastel-/Prototyping-Segment misst die Temperatur und gibt sie an einen Mikrocontroller mit Netzwerkanschluss weiter. Dieser macht einen Webserver auf und liefert ein Dokument aus, das einfach nur die Temperatur beinhaltet. Icinga2 bekommt ein neues Plugin, das die Temperatur liest und dem Wert entsprechend eine Meldung mit einem Status ausgibt (also OK, WARNING, CRITIAL oder UNKNOWN). Für den Serverraum wird in Icinga ein “dummy”-Server angelegt, der “serverroom-temperature” als Metrik führt, auf die dann Alerts gesetzt werden können. Badabing badaboom.

Womit?

  • Als Mikrocontroller habe ich mir einen NodeMCU aus der Bastelkiste genommen, die man mitunter schon für unter 2€ bekommt. Für dieses Projekt sollte jedes ESP8266-Developmentboard gleichermaßen funktionieren.
  • Für den Thermometer-Teil habe ich ein DS18B20 mit einem Meter Kabel gekauft, nämlich bei Amazon
  • Kleinkram: etwas, wo das ganze Draufgebaut werden kann (Breadboard, für festere Installationen Perfboard oder einfach ein Stück Pappe…), ein paar Jumperkabel, ein 4,7 kΩ-Widerstand, ein 5V-USB-Netzteil

Die Gesamtkosten liegen also bei unter 15€.

Softwareseitig habe ich einen Arduino-Sketch von Rui Santos / randomnerdtutorials.com etwas adaptiert, damit er für meine Zwecke funktioniert. Das Icinga-Plugin habe ich als ein sehr simples Bash-Script umgesetzt.

Hardwarebastelei

An der Hardware-Front müssen nur die Komponenten wie in der Fritzing-Zeichnung unten miteinander verbunden werden. Man kann natürlich Pins den eigenen Anforderungen entsprechend anpassen (wenn man ein anderes Board verwendet oder aus anderen Gründen anders verkabeln muss).

Softwareinstallation

Als erstes muss der Arduino-Sketch auf den ESP. Wie das genau geht, steht millionenfach im Internet - wenn die Arduino IDE erstmal für den ESP eingerichtet ist, müssen nur noch die Variablen eingefüllt und das ganze kompiliert und hochgeladen werden.

An der Icinga-Front muss das Plugin auf den Server - in meinem Fall (Standardinstallation unter Debian Stretch) kommt das nach /usr/lib/nagios/plugins/. Außerdem müssen der Check-Command und der Service definiert und der dummy-Host aktiviert werden - das geht im Prinzip einfach per copy-paste aus der icinga-settings.txt - natürlich unter vorbehalt, immer abhängig von deiner konkreten Icinga-Config. Und bei Bedarf können natürlich auch die Temperaturvariablen im Shellscript angepasst werden (also die Schwellwerte, ab wann es zu warm ist).

Danach fehlt nur noch ein beherztes systemctl reload icinga2!

Works!

An der Stelle sollte eigentlich alles von selbst funktionieren. curl <IP-des-ESP> sollte die aktuelle Temperatur zurückliefern und Icinga sollte direkt einen Status anzeigen.

Weiter geht’s

In der Zukunft würde ich das Script gerne um- oder nochmal neu schreiben, damit es Dezimalzahlen unterstützt. Das kann Bash nicht selbst, also müsste man entweder ein Utility wie bc zu Hilfe nehmen oder, was eigentlich deutlich sauberer wäre, das ganze in Python o.ä. neu schreiben. Außerdem sollten die Schwellwerte im service definiert werden und nicht im Plugin selbst, bisher hatte ich keinen Nerv, mich an der Stelle weiter mit Icinga zu prügeln.