XenServer automatisch herunterfahren mit NUT
By zefanja
Unsere Kerninfrastruktur an der Schule ist mit USVs /UPS abgesichert. Wir haben leider immer wieder Stromausfälle (meist kurze) und mit Hilfe der USVs können wir diese zumindest etwas überbrücken. An unserer USV / UPS hängt [ein Raspberry Pi, der als NUT Server][1] eingerichtet ist. Wenn der Strom ausfällt und die USV / UPS auf Batteriebetrieb umschaltet, sendet der Raspberry Pi ab einem bestimmten Ladestand einen Befehl an alle verbunden Server. Diese fahren sich dann automatisch herunter. Alle unsere Virtuellen Maschinen, Backup-Systeme und Server werden damit heruntergefahren. Ein wesentlicher Server hat aber bisher noch gefehlt: der Virtualisierungshost. Deshalb möchte ich heute kurz beschreiben, wie man einen XenServer automatisch herunterfahren lassen kann, indem man ihn als NUT-Client einrichtet.
NUT-Client installieren
XenServer basiert auf CentOS, aber die Installation von Fremdpaketen ist nicht erlaubt. Man sollte sich auch bewusst sein, dass man evtl. keinen Support mehr erhält (falls man einen Supportvertrag hat), wenn man zusätzliche Pakete installiert.
Um den NUT-Client installieren zu können, mussten wir bei unserem XenServer 7 noch folgende Anpassung in der Datei /etc/yum.repos.d/CentOS-Base.repo vornehmen. Im Abschnitt [extras]
haben wir in der Zeile baseurl
$releaseserver
mit einer 7
ersetzt.
$ nano /ect/yum.repos.d/CentOS-Base.repo
...
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep$
baseurl=http://mirror.centos.org/centos/7/extras/$basearch/
...
Danach können wir das Epel-Repo einrichten und den NUT-Client installieren:
$ yum clean all $ yum --enablerepo=extras -y install epel-release ``` Nun schauen wir, welches Paket unseren NUT-Client zur Verfügung stellt und installieren es: ``` $ yum provides /usr/sbin/upsmon Geladene Plugins: fastestmirror Loading mirror speeds from cached hostfile * epel: mirrors.bangmodhosting.com nut-2.7.2-3.el7.x86_64 : Network UPS Tools Quelle : epel Übereinstimmung von: Dateiname : /usr/sbin/upsmon ``` ``` $ yum install nut-client-2.7.2-3.el7.x86_64 ``` ### NUT einrichten Nachdem der NUT-Client nun installiert ist, müssen wir ihn noch konfigurieren, damit unserer XenServer auch herunterfährt, falls der Strom ausfällt. Zuerst müssen wir noch eine Datei erstellen, um NUT mitzuteilen, dass unser XenServer ein Client ist: ``` $ nano /etc/ups/nut.conf MODE=netclient ``` In der Datei _**/etc/ups/upsmon.conf**_ findet die Hauptkonfiguration statt. Dort ändern wir zwei Zeilen: ``` $ nano /etc/ups/upsmon.conf ... MONITOR ups@192.168.1.2 1 upsremote password slave ... SHUTDOWNCMD "/etc/ups/xen-shutdown.sh" ... ``` Je nach Konfiguration des NUT-Masters muss hier noch der UPS-Name, die IP, sowie Benutzername und Passwort angepasst werden. Bevor unser XenServer herunterfährt, soll er vorher noch alle Virtuellen Maschinen ausschalten. Dazu habe ich [folgendes Skript][2] gefunden, welches wir nun herunterladen und ausführbar machen. ``` $ cd /etc/ups/ $ wget https://raw.githubusercontent.com/serrc-techops/NUT-Configuration/master/slave/xen/xen-shutdown.sh $ chmod +x xen-shutdown.sh ``` Damit der NUT-Client auch automatisch startet, müssen wir noch einen Systemd-Service einrichten. Dazu erstellen wir die Datei _**/etc/systemd/system/nut-monitor.service**_ und fügen folgenden Inhalt ein: ``` $ nano /etc/systemd/system/nut-monitor.service [Unit] Description=Network UPS Tools - power device monitor and shutdown controller After=local-fs.target network.target [Service] ExecStart=/usr/sbin/upsmon PIDFile=/run/nut/upsmon.pid Type=forking [Install] WantedBy=multi-user.target ``` Nun aktivieren wir diesen Service und starten ihn: ``` $ systemctl enable nut-monitor.service $ systemctl daemon-reload $ systemctl start nut-monitor ``` Mit `systemctl status nut-monitor` können wir uns anzeigen lassen, ob alles läuft: ``` nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller Loaded: loaded (/etc/systemd/system/nut-monitor.service; enabled; vendor preset: disabled) Active: active (running) since Mi 2018-04-18 17:13:42 ICT; 1 day 12h ago Process: 997 ExecStart=/usr/sbin/upsmon (code=exited, status=0/SUCCESS) Main PID: 1001 (upsmon) CGroup: /system.slice/nut-monitor.service ├─1000 /usr/sbin/upsmon └─1001 /usr/sbin/upsmon ``` ### Automatisches Herunterfahren testen Zuerst können wir das Skript zum Herunterfahren des XenServers testen und schauen, ob auch alle gestarteten VMs heruntergefahren werden. Dazu führen wir das Skript einfach aus: ``` $ sh /etc/ups/xen-shutdown.sh ``` Um einen Stromausfall zu simulieren und können wir auf dem _NUT Master_ folgenden Befehl absetzen: ``` $ sudo upsmon -c fsd ``` Danach muss man allerdings alle Geräte wieder von Hand einschalten oder per Wake-on-Lan wecken. ### Fazit [NUT][3] ist ein tolles Projekt und es erlaubt uns sehr flexible Einsatzszenarien. Zur Zeit haben wir nur eine große UPS am NUT Master angeschlossen, aber es ist auch durchaus denkbar, mehrere UPS an den NUT Master anzuschließen. In Kombination mit Check_MK können wir somit den Status der USV / UPS ständig überwachen und bekommen ganz nebenbei auch eine Statistik, wie oft der Strom bei uns ausgefallen ist. [1]: https://zefanjas.de/server-bei-stromausfall-herunterfahren-ups-nut-co/ [2]: https://github.com/serrc-techops/NUT-Configuration/blob/master/slave/xen/xen-shutdown.sh [3]: http://networkupstools.org/