ADMIN

2022

04

2022-03-31T12:00:00

Automatisierung

SCHWERPUNKT

074

Automatisierung

vSphere

vSphere-Verwaltung mit govc

Wachablösung

von Evgenij Smirnov

Veröffentlicht in Ausgabe 04/2022 - SCHWERPUNKT

Am Anfang der VMware-Automatisierung stand Perl mit der vSphere-CLI und dem VMware Management Assistant. Bereits seit 2009 bietet VMware parallel dazu die PowerShell-Integration mit PowerCLI, die sich inzwischen fest etabliert hat. Doch die Welt der Software-Entwicklung steht nicht still und neue Programmiersprachen erobern den Markt. Wir schauen uns in diesem Workshop an, wie sich vSphere mit der Go-Integration "govc" im Vergleich zur PowerCLI administrieren lässt.

Automatisierung ist heute ein integraler Bestandteil des Rechen­zentrumsbetriebs. Standardisierte APIs bilden dabei die Grundlage für die In­te­gration von Infrastruktur-Systemen in Überwachung, Workflow-Automatisierung oder Container-Orchestrierung. Als vSphere noch "Virtual Infrastructure" hieß, war Perl die Programmiersprache der Wahl für solche Aufgaben. Diese seit 1987 verfügbare Sprache bildete die Grundlage der Kommandozeilen-Schnittstelle "VMware CLI" und der später erschienenen Appliance "vSphere Management Assistant". Beide Produkte haben VMware-Administratoren durch viele Versionen von vSphere begleitet und wurden inzwischen abgekündigt; das Perl-SDK hingegen ist auch für vSphere 7 unterstützt und wird von VMware aktiv gepflegt. Damit können Drittanbieter, die in ihren Anwendungen Perl für die Kommunikation mit vSphere verwenden, weiterhin auf diese API bauen.
Als PowerShell mit dem Release von Windows Server 2008 R2 und Windows 7 angetreten ist, die Windows-Welt zu automatisieren, veröffentlichte VMware mit der PowerCLI sehr schnell eine für die damaligen Verhältnisse äußerst gelungene PowerShell-basierte Schnittstelle zur Verwaltung von vSphere-Umgebungen. PowerCLI wurde ständig weiterentwickelt, auf weitere VMware-Produkte wie Horizon View oder NSX ausgeweitet und schließlich mit dem Release von PowerShell Core für den Einsatz auf Nicht-Windows-Plattformen fit gemacht.
Eine lange Zeit bestand der Eindruck, als würden Perl und PowerShell den Markt für die Verwaltung von vSphere an der Kommandozeile für immer unter sich aufteilen. Dabei arbeitet VMware bereits seit einigen Jahren an einer neuen Integration. Das Projekt "govmomi" [1] realisiert den Zugriff auf das Objektmodell von vSphere in der von Google 2007 kreierten, 2012 veröffentlichten und seitdem gesponserten Sprache Go.
Automatisierung ist heute ein integraler Bestandteil des Rechen­zentrumsbetriebs. Standardisierte APIs bilden dabei die Grundlage für die In­te­gration von Infrastruktur-Systemen in Überwachung, Workflow-Automatisierung oder Container-Orchestrierung. Als vSphere noch "Virtual Infrastructure" hieß, war Perl die Programmiersprache der Wahl für solche Aufgaben. Diese seit 1987 verfügbare Sprache bildete die Grundlage der Kommandozeilen-Schnittstelle "VMware CLI" und der später erschienenen Appliance "vSphere Management Assistant". Beide Produkte haben VMware-Administratoren durch viele Versionen von vSphere begleitet und wurden inzwischen abgekündigt; das Perl-SDK hingegen ist auch für vSphere 7 unterstützt und wird von VMware aktiv gepflegt. Damit können Drittanbieter, die in ihren Anwendungen Perl für die Kommunikation mit vSphere verwenden, weiterhin auf diese API bauen.
Als PowerShell mit dem Release von Windows Server 2008 R2 und Windows 7 angetreten ist, die Windows-Welt zu automatisieren, veröffentlichte VMware mit der PowerCLI sehr schnell eine für die damaligen Verhältnisse äußerst gelungene PowerShell-basierte Schnittstelle zur Verwaltung von vSphere-Umgebungen. PowerCLI wurde ständig weiterentwickelt, auf weitere VMware-Produkte wie Horizon View oder NSX ausgeweitet und schließlich mit dem Release von PowerShell Core für den Einsatz auf Nicht-Windows-Plattformen fit gemacht.
Eine lange Zeit bestand der Eindruck, als würden Perl und PowerShell den Markt für die Verwaltung von vSphere an der Kommandozeile für immer unter sich aufteilen. Dabei arbeitet VMware bereits seit einigen Jahren an einer neuen Integration. Das Projekt "govmomi" [1] realisiert den Zugriff auf das Objektmodell von vSphere in der von Google 2007 kreierten, 2012 veröffentlichten und seitdem gesponserten Sprache Go.
Mächtiges Go
Die Programmiersprache Go [2] ist eine relativ junge Sprache, die sich seit ihrer initialen Entwicklung rasant verbreitet hat. Go hat ihre Wurzeln in C und somit tief in UNIX, was die Sprache sehr mächtig macht. Gleichzeitig ist Go viel leichter zu erlernen als C, was die Popularität der Sprache insbesondere bei Entwicklern gesteigert hat, die von anderen Programmiersprachen darauf umsteigen. Ursprünglich galt Go als "die Sprache der Start-ups", mittlerweile setzen auch Firmen wie Microsoft, Apple oder Twitter verstärkt darauf. Der Zoolatech-Report [3] listet einige Gründe dafür auf, für das nächste Softwareprojekt auf Go zu setzen, und verweist auf weitere Umfrage-Ergebnisse, beispielsweise von StackOverflow.
Die PowerShell ist eine Skriptsprache und benötigt zum Laufen eine Ausführungsumgebung, einen sogenannten PowerShell-Host. Perl-Skripte lassen sich prinzipiell zu ausführbaren Programmen kompilieren, werden aber sehr oft ebenfalls nur interpretiert. Im Gegensatz dazu ist Go eine kompilierte Sprache. Es wird also stets eine ausführbare Datei erstellt und anschließend gestartet. Diese ausführbare Datei ist statisch und enthält alle benötigten Abhängigkeiten. Sie können dieses Programm also auf eine andere Maschine transportieren, die keine Go-Komponenten installiert hat, und dort ohne Probleme ausführen. Die einzige Voraussetzung ist, dass diese neue Maschine das gleiche Betriebssystem und die gleiche Prozessorarchitektur hat wie der Rechner, auf dem Sie Ihr Go-Programm kompiliert haben. Diese Eigenschaft prädestiniert Go besonders für skalierbare Microservices und somit für die Cloud.
VMware und Go
Mit "govmomi" hat VMware das "Managed Object Model" der vSphere-API [4] in Go abgebildet. Damit erhalten Entwickler, die ihre Produkte mit vSphere integrieren wollen, einen qualitativ hochwertigen, kleinen und stabilen Wrapper für die API-Aufrufe und können sich auf die eigene Funktionalität konzentrieren, anstatt auf die API von VMware. Für die ersten Tests stellt VMware mit dem govmomi-Teilpaket "vcsim" einen Simulator für den API-Webservice bereit. Mit diesem können Sie die grundlegende Funktionalität Ihrer vCenter-Integration testen, ohne ein wirkliches vCenter ansprechen zu müssen.
Zum Glück müssen Sie nicht erst die Go-Sprache erlernen und die govmomi-API durchsteigen, um Ihre vSphere-Umgebung mithilfe von Go verwalten zu können. VMware liefert nämlich mit "govc" (Go vSphere CLI) eine Go-Bibliothek, die auf govmomi aufsetzt und auch bei VMware intern zum Testen von govmomi zum Einsatz kommt. Das kompilierte Kommandozeilenprogramm bietet eine vollwertige interaktive CLI und verfügt zurzeit über 291 Befehle aus 43 "Familien". Die Befehle decken die meisten wichtigen Aspekte der vSphere-Administration ab, von rein informativen "about"-Befehlen über Rollen- und Rechteverwaltung bis hin zu Detailkonfigurationen von Hosts und VMs.
Einstieg in govc
Um govc in Ihrer Umgebung auszuprobieren, stehen Ihnen drei Möglichkeiten zur Verfügung. Sie können die fertig kompilierte ausführbare Datei für Ihr Betriebssystem von der Releases-Seite des GitHub-Repository [5] herunterladen. Nach dem Entpacken des Archivs steht die "govc.exe" (Windows) oder "govc" (UNIX/ Linux/macOS) ohne weitere Installationsschritte bereit.
Arbeiten Sie mit Linux und haben Sie bereits eine konfigurierte Docker-Engine auf Ihrem System, können Sie govc auch als einen fertigen Docker-Container herunterladen und ausführen. Mit docker pull vmware/govc erhalten Sie die jeweils aktuelle Version des wenige MByte großen Containers, die Sie mit docker run --rm -it vmware/govc /govc ausführen. Dem obigen Aufruf müssen Sie natürlich den gewünschten govc-Befehl sowie die Authentifizierungs- und Verbindungsdaten hinzufügen, denn nach der Abarbeitung des Befehls wird der Container beendet und entladen. Schließlich können Sie den Go-Compiler auf einem geeigneten Computer installieren und govc aus dem Quellcode kompilieren.
Zum Importieren der Pakete in Ihre Go-Umgebung verwenden Sie den Befehl go get -u github.com/vmware/govmomi und bauen sich die ausführbaren Dateien anschließend mit go build govmomi. Die so erstellte govc-Datei ist, genau wie die heruntergeladene Datei aus dem GitHub-Repository, nur einige MByte groß und portabel. Der erste Funktions- und Verbindungstest von govc ist typischerweise der about-Befehl:
govc about -u
   <user>:<password>@<fqdn des vCenters oder ESXi-Hosts>
Waren der Verbindungsaufbau und die Authentifizierung erfolgreich, erhalten Sie die grundlegenden Informationen zum angesprochenen vCenter oder Host angezeigt.
Bild 1: Der about-Befehl zeigt einige Informationen an, hier als Container.
Unsicheres Anmelden
Bereits die ersten Experimente mit govc offenbaren zwei Probleme, zumindest wenn wir das Programm unter Windows einsetzen möchten. Zum einen ist "govc.exe" nicht signiert. Das betrifft sowohl eine selbst in Go kompilierte ausführbare Datei als auch die auf GitHub zum Download bereitgestellte Variante. Falls Sie über ein vertrauenswürdiges Code-Signing-Zertifikat verfügen, können Sie die heruntergeladene Datei natürlich selbst signieren, zum Beispiel mit dem Standardwerkzeug "SignTool" von Microsoft [6]. Dies müssen Sie jedes Mal wiederholen, wenn Sie ein neues Release von GitHub herunterladen oder selbst kompilieren.
Das zweite Problem ist in vielen Umgebungen gravierender. Beim Arbeiten mit govc kommen Sie nicht darum herum, das Passwort für die Verbindung zu Ihrem vCenter oder ESXi-Host mindestens einmal im Klartext einzugeben. Je nachdem, in welcher Kommandozeilen-Umgebung Sie arbeiten, bleiben Ihre Eingaben in der Command History langfristig gespeichert. Die meisten Beispiele im Internet verwenden für govc entweder eine explizite Authentifizierung mit Hostname, Benutzername und Kennwort oder die Umgebungsvariablen "GOVC_URL", "GOVC_USERNAME" und "GOVC_PASSWORD". Beides ist gleichermaßen unsicher und führt zu einem separaten Authentifizierungsvorgang bei jedem govc-Befehl, was am vCenter protokolliert wird und unter Umständen im SIEM auffallen könnte.
Neben Benutzernamen und Kennwort ist auch eine Anmeldung mit Zertifikaten möglich. Doch auch hier muss der Private Key als Datei auf dem System vorliegen. Dies kann für gehärtete Automatisierungsserver ein akzeptabler Weg sein. Für interaktive Administration von einer gemeinsam genutzten Maschine aus ist dieser Ansatz genauso kritisch zu hinterfragen wie das Speichern von Credentials in Umgebungsvariablen.
Von PowerCLI kennen Sie sicher den Aufbau authentifizierter Verbindungen am Anfang der Sitzung und das Wiederverwenden dieser Verbindungen bei allen im Nachgang übergebenen Befehlen. Ein ähnlicher Mechanismus existiert auch in govc. Mit
govc session.login -u  <user>:<password>@<host> -export
bauen Sie einmalig eine authentifizierte Session auf, die daraufhin in Ihrem Benutzerprofil unter "~/.govmomi/sessions" gespeichert ist. Diese Session können Sie bei allen weiteren Befehlen wiederverwenden, indem Sie zum Parameter "-u" lediglich den Benutzernamen und den Hostnamen angeben, nicht jedoch das Kennwort: govc about -u <user>@<host>
Falls Ihre Maschine dem SSL-Zertifikat des vCenters oder des ESXi-Hosts nicht vertraut, müssen Sie govc anweisen, diesen Umstand zu ignorieren. In PowerCLI ist es eine Konfigurationseinstellung, die Sie mittels des Cmdlets "Set-PowerCLIConfiguration" vornehmen. Für govc setzen Sie einfach die Umgebungsvariable "GOVC_INSECURE" auf den Wert "true". Unter Windows müssen Sie dafür den SET-Befehl, unter Linux das Kommando export verwenden.
Bild 2: Bequem, aber nicht sehr sicher: Anmeldeinformationen in Umgebungsvariablen speichern.
Erste Schritte mit govc
Haben Sie sich mit dem Befehl govc about vergewissert, dass die Verbindung zu Ihrer vSphere-Umgebung mit den angegebenen Zugangsdaten möglich ist, können Sie anfangen, Objekte aufzulisten und Aktionen auszuführen. Die Syntax aller govc-Befehle folgt einem einheitlichen Muster:
govc <Befehl> [<Parameter>] [<Objekt>] [<Filter>]
Die Liste aller vorhandenen Befehle erhalten Sie am einfachsten, indem Sie govc ohne jegliche Zusatzparameter aufrufen. Alternativ können Sie die offizielle Übersicht [7] bemühen, die außerdem die notwendige Parameter-Syntax und Beispiele für jeden Befehl liefert. Die Parameter beginnen Linux-typisch mit einem Bindestrich (Minus-Zeichen) und sind voneinander und von ihren jeweiligen Werten durch Leerzeichen getrennt. Wir haben bereits den Parameter "-u" kennengelernt, der die Verbindungs- und Anmeldedaten als URL erwartet. Diesen Parameter werden wir in allen nachfolgenden Beispielen um der Kürze willen weglassen.
Das "Objekt" kann ein Ordnerpfad innerhalb der vSphere-Hierarchie oder der Name eines Objekts sein. Um die grundlegenden Informationen zu einer virtuellen Maschine zu erhalten, führen Sie beispielsweise govc vm.info TESTVM01 aus. Der "Filter" ist eine Abfolge von Key-Value-Paaren, wobei der Key jeweils eine Objekteigenschaft darstellt und mit Bindestrich gekennzeichnet wird. Um beispielsweise alle Elemente im Ordner für virtuelle Maschinen zu finden, deren Name mit "TESTVM" beginnt, verwenden Sie
govc find /<Datacenter>/vm -name TESTVM*
Dieser Befehl findet sowohl die VMs "TESTVM01" und "TESTVM02" als auch den VM-Ordner "TESTVMs". Möchten Sie lediglich die VMs im Suchergebnis sehen, können Sie noch den Filter nach Typ hinzufügen:
govc find /<Datacenter>/vm -name TESTVM* -type m
Ein anderer Befehl zum Auffinden von vSphere-Ressourcen ist das aus Linux bekannte Kommando ls. So listet govc ls /<Datacenter>/vm alle Objekte (VMs und Ordner) direkt unterhalb der VM-Hierarchie auf, während govc ls /<Datacenter>/vm/* alle Objekte im gesamten Baum liefert. Von ls gibt es auch objektbezogene Varianten wie host.option.ls oder library.ls, die auf Objekte bestimmter Typen spezialisiert sind. Dem Anlegen eines neuen Objekts, beispielsweise einer virtuellen Maschine, dienen create-Befehle wie
govc vm.create -on=false -m 4096 -c 2 -g freebsd64guest -ds="<Datastore>" -net="<Portgruppe>" -disk=20G TESTVM123
Zum Starten, Beenden oder Herunterfahren einer VM verwenden Sie den Befehl vm.power, so beispielsweise govc vm.power -on TESTVM123. In allen Fällen ist ein gutes Verständnis der Zusammenhänge im Objektmodell der vSphere-API von großem Vorteil. Falls Sie bereits in früheren Zeiten mit der Perl-basierten VMware-CLI Erfahrung gemacht haben, werden Sie sich in govc ohne große Probleme zurechtfinden.
Die meisten Beispiele für den Einsatz von govc, die Sie in der offiziellen Dokumentation und im Internet finden, beziehen sich auf den Einsatz unter Linux. Während die Syntax von govc selbst unter allen Betriebssystemen identisch ist, werden in den Beispielen oft weitere Befehle für die Verarbeitung der govc-Ergebnisse verwendet, die unter Windows nicht zur Verfügung stehen.
Link-Codes
[2] Go-Projektseite: https://go.dev/
Mehr als nur Textkolumnen
Standardmäßig erhalten Sie von govc-Befehlen, die Informationen aus der vSphere-Umgebung extrahieren, eine aufgeräumte, aber unformatierte Textausgabe auf der Konsole. Im Gegensatz zu PowerCLI, wo alle Rückgabewerte PowerShell-typisch Objekte sind, erscheint dies auf den ersten Blick als ein Rückschritt, zumindest wenn Sie die ausgegebenen Daten weiter maschinell verarbeiten möchten.
Da govc eine direkte Schnittstelle zur Web­API von vSphere bildet, können Sie hier von den Rückgabemodi profitieren, die jede moderne API typischerweise anbietet: XML und JSON. Alle govc-Befehle akzeptieren die Parameter "-json" beziehungsweise "-xml" und geben die gewünschten Informationen im angegebenen Format aus. Wenn Sie diese Art von Ausgabe ausprobieren, werden Sie feststellen, dass in den JSON- oder XML-Daten viel mehr Informationen enthalten sind als in der ursprünglichen Textausgabe.
Für die Verarbeitung standardkonformer JSON-Strukturen stehen Ihnen alle Möglichkeiten Ihrer gewählten Plattform zur Verfügung. Unter Linux/bash ist das Paket "jq" [8] das Mittel der Wahl. Damit können Sie sowohl ganze JSON-Datensätze für die bessere Lesbarkeit farblich kennzeichnen als auch einzelne Eigenschaften oder Objekte herausfiltern. Übrigens: jq gibt es auch für Windows. Um beispielsweise den Namen und den Status aller VMs anzuzeigen, können Sie sich des folgenden Befehls bedienen:
govc ls -u <Verbindung> -json /<Datacenter>/vm/* |
jq -r '.elements[].Object | [.Name, .Runtime.PowerState] | @tsv'
Mit der JSON-Datenstruktur müssen Sie sich vertraut machen, bevor Sie solche Abfragen zuverlässig aus dem Kopf schreiben können. Beachten Sie dabei: Alle Namen von Objekten, ihre Eigenschaften, Pfade et cetera sind in govc "case sensitive". Sie müssen sie daher in Bezug auf die Groß- und Kleinschreibung genauso angeben, wie sie in der API beziehungsweise in der Inventur Ihrer vSphere-Umgebung definiert sind.
Falls Sie in einer Umgebung unterwegs sind, in der die PowerShell vorhanden ist, aber das PowerCLI-Modul fehlt und nicht nachinstalliert werden kann, können Sie auch die PowerShell verwenden, um die strukturierten JSON-Daten zu verarbeiten. Der eben gezeigte Befehl ließe sich wie folgt umsetzen:
$vms = govc ls -u <Verbindung> -json /<Datacenter>/vm/*
 
$vms | ConvertFrom-JSON | Select-Object -ExpandProperty elements | Select-Object -ExpandProperty Object | Format-Table Name, @{l='PowerState'; e={$_.Runtime.PowerState}}
Hier profitieren Sie davon, dass die PowerShell Ihnen die Übersetzung der Groß- und Kleinschreibung bei Objekteigenschaften abnimmt. Natürlich können Sie die PowerShell auch dafür verwenden, die govc-Aufrufe mit den vielen Parametern zusammenzusetzen und beispielsweise die Anmeldedaten in einem geschützten PSCredential-Objekt zu halten und nur bei Bedarf in Benutzername und Passwort aufzulösen.
Fazit
Mit govc stellt VMware eine kleine portable CLI für die Verwaltung aller Aspekte von vSphere zur Verfügung. Die govc-CLI kann auf nahezu beliebigen Betriebssystemen und CPU-Architekturen eingesetzt werden. Damit können Sie schnell und unkompliziert von einem beliebigen Rechner aus den Status von vSphere-Objekten abfragen oder Aktionen in Ihrem virtualisierten Rechenzentrum ausführen. Auf Linux lässt sich govc innerhalb nativer bash-Skripte verwenden. Dank der leichten und portablen ausführbaren Datei ist govc sehr gut in Workflow-Werkzeuge wie Ansible oder auch in das Container-Management integrierbar.
(dr)