[Update] Server bei Stromausfall herunterfahren – UPS, NUT & Co

[Update] Server bei Stromausfall herunterfahren – UPS, NUT & Co

An unserer Schule gibt es immer wieder Stromausfälle. Manchmal dauern sie nur wenige Sekunden, manchmal aber auch mehrere Stunden. Damit unsere IT-Infrakstruktur nicht darunter leidet, haben wir für unsere Server und Netzwerkgeräte eine UPS/USV installiert. Diese helfen kürzere Stromausfälle (bis zu 1 Stunde) oder Stromschwankungen zu überbrücken. Für alle längeren Ausfälle fahren wir unsere Server automatisch herunter, wenn die UPS ein kritisches Batterielevel erreicht. Dafür nutzen wir NUT (Network UPS Tools).

Unser Setup besteht aus folgenden Komponenten:

  • Raspberry Pi als UPS-Server bzw. Master
  • Liebert GXT4 UPS
  • Server als Clients bzw. Slaves

UPS / USV in NUT auf dem Raspberry Pi einrichten

Für den Raspberry Pi verwenden wir das Standard Raspian Stretch Lite Image. Zu beachten ist, dass SSH seit 2016 standardmäßig nicht mehr aktiviert ist. Die verschiedenen Möglichkeiten, wie man SSH wieder aktiveren kann, sind hier dokumentiert. Nachdem SSH nun wieder aktiviert ist, kann man sich nun auf dem Raspberry Pi einloggen (die IP des Raspberry Pi kann man z.B. mit  avahi-browse -ar  von einem Rechner im gleichen Netzwerk herausfinden oder man schließt einen Monitor und Tastatur an). Die IP brauchen wir später noch, deshalb ist es sinnvoll dem Raspberry Pi eine statische IP zu geben.

Als nächstes installieren wir den NUT-Server mit

Falls die UPS / USV per USB angeschlossen ist (wie in unserem Fall), kann man mit  lsusb überprüfen, ob sie auch erkannt wurde. So sieht die Ausgabe auf dem Raspberry Pi aus:

In der ersten Zeile sieht man, dass unsere Liebert UPS erkannt wurde.

Nun müssen wir unsere UPS / USV in der Datei /etc/nut/ups.conf konfigurieren. Für unsere UPS sieht der Eintrag folgendermaßen aus:

Auf der Website der Network UPS Tools findet man eine Liste mit allen unterstützen UPS /USV und mit welcher Treiber am besten funktioniert.

Als nächstes wollen wir testen, ob die Einstellungen korrekt sind der UPS Daemon mit der UPS kommunizieren kann. Dazu starten wir upsd mit sudo upsdrvctl start . Eine erfolgreiche Ausgabe sollte ungefähr so aussehen:

NUT enthält einen kleines Programm, mit dem man die Kommunikation mit der UPS /USV testen kann. Es heißt upsc und gibt alle lesbaren Parameter der UPS / USV aus.

Nun ist unsere UPS /USV erfolgreich eingerichtet. Als nächsten richten wir den NUT Server, den UPS Monitor upsmon und noch zwei Benutzer für den Master und die Slaves ein.

NUT Server konfigurieren

In der /etc/nut/nut.conf legen wir fest, dass der Raspberry Pi unser Master ist:

Auf dem NUT-Server läuft der UPS Daemon (upsd). Er ist für die (physikalische) Verbindung zur UPS verantwortlich. Die einzelnen Clients/Slaves greifen mit Hilfe des upsmon auf den Status der UPS zu. So können mehrere Clients immer über den Zustand der UPS informiert sein und gegebenenfalls das Herunterfahren auslösen, wenn die UPS den Status „On Low Battery“ liefert.

Damit unser NUT Server aus dem Netz erreichbar ist, müssen noch folgende Zeilen in der /etc/nut/upsd.conf hinzugefügt werden (IP bitte anpassen):

Als nächstes legen wir die Benutzer fest mit der sich ein Client beim Master anmelden kann (in der Datei /etc/nut/upsd.user):

Damit upsmon die UPS auch überwacht, müssen wir nun noch eine letzten Eintrag in der Datei /etc/nut/upsmon.conf hinzufügen:

Damit man weiß, ob alle Dienste richtig laufen, kann man den Status des Servers als auch den lokalen Clients auf dem Raspberry Pi (denn der soll ja auch heruntergefahren werden, wenn kein Strom mehr da ist) mit folgendem Befehlen überprüfen:

Nun ist unser Master fertig eingerichtet und die Clients bzw. Slaves können jetzt konfiguriert werden.

Clients / Slaves einrichten (z.B. Server, andere Computer)

Zuerst müssen auf einem Client die notwendigen Pakete installiert werden:

Diesmal müssen wir nur zwei Dateien editieren. In der /etc/nut/nut.conf legen wir den Modus fest:

Danach müssen wir wieder upsmon sagen, welche UPS er überwachen soll (in /etc/nut/upsmon.conf):

Die IP und das Passwort müssen natürlich noch angepasst werden. Bitte auch das slave am Ende beachten! Zuletzt noch den entsprechenden Service neu starten und überprüfen, ob alles läuft:

Glückwunsch! Nun sollte alles eingerichtet sein, aber wie kann man testen, dass es wirklich funktioniert?

Herunterfahren testen

Der folgende Befehl löst das Signal zum Herunterfahren aus (wie es auch im Falle eines Stromausfalls sein würde):

UPS mit Check_MK überwachen [Update]

Check_MK Agent einrichten

Nachdem die UPS jetzt fertig eingerichtet ist, wäre es natürlich toll, wenn wir sie auch im Monitoring überwachen können. Wir nutzen dafür Check_MK. Clients können in Check_MK mit dem Check_MK Agenten oder per SNMP überwacht werden. Der Agent ist in den Standard-Paketquellen von Debian und Ubuntu enthalten, weshalb wir ihn einfach mit diesem Befehl auf dem Raspberry Pi installieren können:

Standardmäßig ist der Check_MK Agent nicht aktiviert, sodass wir ihn noch in der Datei /etc/xinetd.d/check_mk noch aktivieren müssen. Am Ende der Datei muss disable = yes  in disable = no  geändert werden. Wenn man möchte, kann man auch noch den Zugriff einschränken, indem man mit only_from = IP-des-Check-MK-Severs  die Server-IPs einträgt, die die Erlaubnis haben die Daten des Check_MK Agenten abzufragen.

Als nächstes muss xinetd neu gestartet werden. Mit dem zweiten Befehl überprüfen wir, ob der Check_MK Agent richtig konfiguriert ist und läuft (IP anpassen!).

NUT Plugins

Bisher weiß der Check_MK Agent noch nichts von unserer UPS und liest die entsprechenden Daten auch nicht aus. Mit folgendem kleinen Skript können wir die Ausgabe von upsc dem Agenten mitteilen:

Diese kleine Plugin speichern wir unter /usr/lib/check_mk_agent/plugins/nut. Auf dem Raspberry Pi sind wird nun fertig. Es fehlen jetzt noch die Anpassungen auf dem Check_MK Server.

Auf dem Server brauchen wir ein weiteres Skript, welches die Daten des Check_MK Agenten ausliest. Dieses Skript ist umfangreicher, deshalb verlinke ich es hier. Es muss unter /opt/omd/versions/default/share/check_mk/checks/nut gespeichert werden. Das Original-Plugin kann man hier finden: https://github.com/minodudd/check_mk-plugins. Ich habe es minimal angepasst für unsere UPS angepasst.

Wenn man nun den Raspberry Pi als neuen Host in Check_MK hizufügt, werden die Services für die UPS / USV mit angezeigt. Toll 🙂

NUT Services
NUT Services

Fazit

NUT ist ein weiteres tolles Open Source Projekt, mit dem sehr flexible Anpassungen möglich sind. In dieser PDF sind noch viele weitere (komplexe) Anwendungsszenarien enthalten. Während ich diesen Artikel schreibe, haben wir wieder einen Stromausfall und alle unsere Server sind zuverlässig heruntergefahren worden 🙂

 

Ein Gedanke zu „[Update] Server bei Stromausfall herunterfahren – UPS, NUT & Co

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.