Das Problem
Je nach Anforderung kann es vorkommen, dass auf eine XenServer eine VM läuft, die eine Freigabe bereitstellt, welche im XenServer als SR eingebunden ist. Wenn nun der XenServer (oder auch nur die entsprechende VM) neu gestartet werden, dann wird der SR im XenServer inaktiv und muss via Kommandozeile oder via XenCenter "repariert" werden. Da dies ein manueller Schritt ist, kann es hier zu Problemen kommen, etwa wenn vergessen wird, den SR wieder verfügbar zu machen.
Die Idee
Es bietet sich deshalb an, diesen Prozess zu automatisieren und den Startprozess der VM so zu erweitern, dass nach Bereitstellung der Freigabe automatisch eine "Reparatur" des SR-Eintrages im XenServer vorgenommen wird.
Die Lösung
Citrix bietet auf der Download-Seite der OpenSource-Version auch ein Software Development Kit (SDK) an. Dieses stellt Zugriffsmöglichkeiten für verschiedene Programmiersprachen wie Java, C#, Python und C sowie ein Powershell Plugin zur Verfügung.
Im folgenden gehe ich davon aus, dass es sich um eine Debian 8.x VM handelt. Dort ist Python installiert und die VM kann übers Netzwerk auf den XenServer zugreifen.
Das Vorgehen - Schritt für Schritt
1. Das XenServer SDK herunterladen und lokal entpacken
Auf der Download-Seite http://xenserver.org/open-source-virtualization-download.html muss das für die XenServer-Version passende SDK heruntergeladen und auf dem eigenen Rechner entpackt werden.
2. Das Skipt und notwendige Dateien vorbereiten
Im Verzeichnis XenServerPython des SDK befinden sich die Dateien XenAPI.py und provisioning.py, die in ein neues Verzeichns kopiert werden müssen. In dieses Verzeichnis wird dann auch noch die nachfolgende Datei, z.B. unter dem Namen replug-share.py, gepackt.
#!/usr/bin/env python import XenAPI import sys def main(session): disabledPbd = session.xenapi.PBD.get_by_uuid("<pbd-uuid>") session.xenapi.PBD.plug(disabledPbd) if __name__ == "__main__": new_session = XenAPI.Session("http://<xen-server-ip>") try: new_session.xenapi.login_with_password("<xen-username>", "<xen-password>") except XenAPI.Failure as f: print "Cannot create the session: %s" % f.details sys.exit(1) try: main(new_session) except XenAPI.Failure as e: print e.details sys.exit(1) finally: new_session.xenapi.session.logout()
Die in <...> eingeschlossenen Werte werden im folgenden ermittelt und müssen dann im Skript passend ergänzt werden.
3. Die Konfigurationswerte für das Skript ermitteln
xen-server-ip
Dieser Wert sollte bekannt sein; hier wird einfach die IP des XenServers eingetragen, unter der er aus der VM heraus aufgerufen werden kann.
xen-username, xen-password
Dies sind die Zugangsdaten des administrativen Benutzers auf dem XenServer. Diese müssen im Klartext angegeben werden. Es kann zwar in der Kommandozeile des XenServer ein weiterer Benutzer mit eigenem Kennwort angelegt werden, allerdings muss dieser die UID 0 / GID 0 haben, also effektiv root sein. Sollte sich hier noch eine andere Möglichkeit ergeben, werde ich diese noch ergänzen.
pbd-uuid
Diese UUID muss über die Kommandozeile des XenServer (unter Zuhilfenahme des XenCenter) ermittelt werden. Hier kann man wie folgt vorgehen:
- Im XenCenter die UUID des SR ermitteln.
- Auf dem XenServer mit xe pbd-list sr-uuid=<sr-uuid> die UUID des PBD ermitteln.
- Die pbd-uuid entspricht dem Wert von uuid in der Ausgabe des vorherigen Befehls.
4. Benötigte Dateien auf die VM packen und VM-Start konfigurieren
Wenn das eigene Skript konfiguriert ist, packt man es zusammen mit den beiden anderen Dateien auf die VM, am besten in ein neues Verzeichnis. Dann muss noch das x-Dateiflag für das Skript gesetzt werden, am einfachsten mittels chmod a+x replug-share.py
Wie das Skript beim Start der VM ausgeführt wird, hängt von der jeweiligen Distribution ab. Unter Debian kann man das Skript bespielsweise in der Datei /etc/rc.local aufrufen lassen.
5. Test des Skripts
Um das Skript zu testen, wartet man entweder den nächsten Reboot der VM ab, oder führt diesen direkt jetzt aus, aber nur, wenn die Infrastruktur des Gesamtsystems dies zulässt, d.h. der freigegebene Storage nicht immer verfügbar sein muss. Alternativ kann man das Skript aber auch kopieren und das PBD.plug durch ein PBD.unplug austauschen, wodurch der SR über die API deaktiviert wird.
Disclaimer, Weiterführendes
Das Vorgehen eignet sich aufgrund des im Klartext zu hinterlegenden Kennwortes für den administrativen Benutzer des XenServer nicht unbedingt für Produktivsysteme, bzw. es ist darauf zu achten, dass die Skriptdatei nur für authorisierte Benutzer zugreifbar ist (ggf. ist die VM, die einen solchen Storage bereitstellt, auch schon selbst passend abgesichert).
Dieses Verfahren lässt sich auch in abgewandelter Variante für andere Prozesse nutzen, da über die API recht viele Aktionen auf dem XenServer ausgeführt werden können. Statt diese über ein Python-Skript auf der Kommandozeile auszuführen, kann auch eine Webapplikation (dann entweder in Python oder auch C# bzw. Java) entwickelt werden, die dann die jeweiligen API-Aufrufe vornimmt, sodass der Endbenutzer gar keinen direkten Zugriff mehr benötigt. Eine Beschreibung der API-Aufrufe und Objekte sowie weitere Beispiele findet man in den entsprechenden Verzeichnissen des XenServer SDK.