Libvirt mit Python verwenden

fourseasons, 123RF

Ferndiagnose

Wer zur Verwaltung seiner virtuellen Systeme keines der großen Management-Frameworks einsetzen möchte, findet in der Libvirt-Bibliothek für Python eine Alternative.
Das Titelthema im ADMIN 04/14 "Vernetzt speichern" sind Netzwerkdateisysteme, etwa Samba 4, verteilter Storage mit Ceph & GlusterFS und der Unix-Klassiker ... (mehr)

In Enterprise-Umgebungen kommen oft umfangreiche Management-Frameworks zum Einsatz, um den Zoo an virtuellen Systemen und anderen Ressourcen zu verwalten. Wer es eine Nummer kleiner angehen möchte und lieber auf das Virtualisierungs-Framework Libvirt setzt, kann über dessen API viele Aufgaben automatisieren.

Ich hatte neulich so einen Fall: Auf einer Reihe von Hypervisor-Systemen wurden über ein Provisioning-Frontend eine Vielzahl von virtuellen Systemen erzeugt. Ich wollte nun gerne wissen, wann eine Maschine auf einem Host zur Verfügung steht. Natürlich hätte man das Frontend so ändern können, dass eine Nachricht versendet wird, wenn ein neues System installiert wird – leider hatte ich aber keinen Zugriff auf das Provisioning-System.

Auch der Zugriff auf eines der Management-Tools (»virsh« oder »virt-manager« ) wäre möglich, ist aber auf die Dauer recht umständlich. Besonders dann, wenn man an einer Workstation sitzt und diese Tools dort gar nicht installiert sind. Um das Problem zu lösen, habe ich mich dafür entschieden, einfach eine Anfrage an die Libvirt-API der vorhandenen Hypervisor-Systeme zu senden und eine Liste der aktiven und inaktiven Systeme abzufragen. Die Ausgabe lässt sich dabei natürlich mit beliebigen Informationen versehen, für mich ist aber nur interessant, welche Systeme online und welche offline sind.

Das Virtualisierungs-Framework bietet eine Reihe von Authentifizierungsverfahren an. Da Zeit immer knapp ist, entscheide ich mich für eine einfache SSH-basierte Anmeldung auf den Host-Systemen. Hierfür erzeuge ich einen Benutzer »virtuser« und lege gleich einen SSH-Schlüssel für ihn an. Der Benutzer wird inklusive SSH-Schlüssel über ein zentrales FreeIPA-System verwaltet (Abbildung 1).

Abbildung 1: Neben der SSH-Authentifizierung muss auf einem Hostsystem auch die Zugangskontrolle zum Libvirt-Service definiert werden.

Bei der Zugangskontrolle ist es günstig, dem neuen Benutzer den Zugang zum Libvirt-Framework zu erlauben, da ohne entsprechende Anpassungen lediglich der Root-Benutzer Zugang hat. Dies geschieht auf aktuellen Systemen über die Software »polkit« . Ab Version 0.112 existiert hierfür sogar eine eigene Engine, die man mit Javascript-basierten Regeln füttern kann. Damit lassen sich wirklich interessante Sachen anstellen. Zum Beispiel, einem Benutzer Zugang nur zu einem bestimmten System zu geben oder nur dann, wenn es auf einem bestimmten Hypervisor läuft. Auch die Aktionen, die ein Benutzer ausführen kann, lassen sich sehr fein abgestuft unterscheiden.

Aber zurück zum Thema. Ich entscheide mich dafür, den Zugang einer ganzen Gruppe zu erlauben. So kann auch ich mit meinem persönlichen Account auf die Systeme zugreifen und muss hierfür nicht als Root eingeloggt sein. Um für alle Mitglieder der Gruppe »virt« den Zugang zu ermöglichen, erzeuge ich auf allen Host-Systemen eine einfache Regel-Datei (Listing 1). Ein »systemctl restart polkit.service« liest das neue Regelwerk schließlich ein.

Listing 1

/etc/polkit-1/rules.d/60-libvirt.rules

 

Wenn sichergestellt ist, dass der Benutzer »virtuser« Mitglied der Gruppe »virt« ist, gibt ein erster Test darüber Auskunft, ob der Zugriff funktioniert:

# virsh -c qemu+ssh://virtuser@ernie/system version
Compiled against library: libvirt 1.1.3
Using library: libvirt 1.1.3
Using API: QEMU 1.1.3
Running hypervisor: QEMU 1.6.1

Klappt der Zugriff, reichen wenige Zeilen Python, um an die gewünschten Informationen zu kommen (Listing 2). Die Hypervisor-Hosts sind im Array »hv« definiert. In der folgenden Schleife wird dann jeweils die Verbindungs-URI zusammengebaut, mit der über das Objekt »conn« eine Verbindung zu den vorhandenen Hosts aufgebaut wird. Über die beiden Funktionen »listDomainsID« und »listDefinedDomains« bekomme ich schließlich die gewünschten Informationen heraus und lasse mir die Namen der virtuellen Systeme ausgeben. Wenn ich das Skript nun manuell aufrufe, erhalte ich das Ergebnis in Listing 3.

Listing 2

list-virt-systems.py

 

Listing 3

Ergebnis

 

Wunderbar, das Skript funktioniert wie erwartet. Der Einfachhalt halber lasse ich nun »crond« das Skript aufrufen und schiebe die Ausgabe in das Document-Root meines Webservers. Rufe ich dann die passende URL auf, sehe ich sofort, welche Maschinen zur Verfügung stehen und welche Systeme zwar bereits auf den Hypervisoren angelegt wurden, aber noch nicht online sind.

Das kleine Beispiel ist bewusst einfach gehalten. Wer das Skript für ernsthafte Anwendungen einsetzen möchte, sollte zumindest noch ein Exception-Handling einbauen. Wer mag, der kann die Funktionen der API natürlich nicht nur zur Abfrage von Status-Informationen verwenden, sondern kann hierüber auch neue Systeme anlegen oder andere virtuelle Ressourcen, beispielsweise Netzwerke, definieren.

Auf Fedora-Systemen werden die Python-Bindings über das Paket »libvirt-python« zur Verfügung gestellt. Im Dokumentations-Folder befinden sich weitere Beispiele, die als Grundlage für weitere Experimente dienen können. Spannend wird es auch, wenn man der VMware-Fraktion zeigen kann, wie sich ihre Systeme über ein kleines Skript verwalten lassen. Hierbei ist dann allerdings daran zu denken, Libvirt mit einem entsprechenden ESX-Treiber auszustatten.

Der Autor

Thorsten Scherf arbeitet als Senior Technical Account Manager für Red Hat EMEA. Er ist oft als Vortragender auf Konferenzen anzutreffen. Wenn ihm neben der Arbeit und Familie noch Zeit bleibt, nimmt er gerne an Marathonläufen teil.

comments powered by Disqus
Mehr zum Thema

Verschlüsselung mit Libvirt

Wer mehr als eine Virtualisierungstechnologie einsetzt, muss sich mit sehr unterschiedlichen Verwaltungstools beschäftigen. Die Abstraktionsschicht Libvirt vereinheitlicht den Zugriff und verschlüsselt seit neuestem auch den Datenspeicher.

Artikel der Woche

Loadtests ohne Server

Für Loadtests der eigenen Server bietet sich die Cloud an, denn kurz getaktet lassen sich dort viele Rechnerinstanzen starten, die das eigene Budget nur wenig belasten. Noch flexibler, günstiger und besser skalierbar sind Tests mit einer Serverless-Infrastruktur wie AWS Lambda. Wir führen vor, wie Sie dort mit Serverless Artillery eigene Loadtests starten. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Container

Wie setzen Sie Container ein?

  • Gar nicht
  • Docker standalone
  • Docker mit Kubernetes
  • Docker mit Swarm
  • Docker mit anderem Management
  • LXC/LXD
  • Rocket
  • CRI-O auf Kubernetes
  • Container auf vSphere
  • Andere (siehe Kommentare auf der Ergebnisseite)

Google+

Ausgabe /2018