VMWare und die Powershell

Es gibt Dinge im Leben die benötigt Mann im Normalfall nur sehr selten, wenn Mann diese aber mal für sich entdeckt hat dann möchte Mann diese auch nicht mehr missen.
Eines dieser Dinge ist die Windows Powershell im Zusammenspiel mit einem VMWare vCenter. Vor allem wenn ein mittelschweres vCenter zu Inventarisieren ist. Mittelschwer heist in diesem Fall: 5 ESX Hosts, 26 Datastores und 65 Virtuelle Maschinen.

Aber was wollen wir uns da nun anschauen?
Zunächst einmal ist das vCenter gewachsen. Das heist es wurden VMs entfernt, neu eingerichtet oder verschoben. Alle diese Arbeiten hinterlassen unter Umständen spuren in Form von Dateileichen. Diese gilt es aufzuspüren und anschliessend zu sichern und/oder zu löschen.
Oder das vCenter muss komplett umziehen an einen anderen Standort. Hin und wieder benötigt man auch mal eine Virtuelle Hardware Liste. Sprich wieviel Arbeitsspeicher, CPUs und Festplatten hat solch eine VM und vor allem in welchem Datastore liegen die Platten bzw. auf welchem Host läuft die Maschine gerade. Und wo wir schon dabei sind, wie ist der Host gerade ausgelastet und welcher Host hat gerade nix zu tun. So kann man dann auch schnell mal eine VM auf einen Host verlagern der gerade wenig bis nichts zu tun hat. Und das ganze Scriptgesteuert.
Aber genug der langen Vorrede. Fangen wir einfach mal klein an.

Vor dem ganzen Spass ist aber erstmal eine kleine Hürde zu meistern. Ohne ein Snapin von VMWare gehts nicht. Also muss man sich die VMWare Power CLI erstmal hier downloaden und installieren. Auf derselben Seite gibts auch gleich noch eine Doku dazu. Bitte diese auch vorher lesen.
Jetzt können wir auch direkt über die Powershell ISE folgenden Code ausführen:

Write-Host "Lade VMWare SnapIn"
$ErrorActionPreference = "SilentlyContinue"
$VMWareSnapInLoaded = Get-PSSnapin -Name "VMware.VimAutomation.Core"
if (!$VMWareSnapInLoaded) {
    Add-PSSnapin VMware.VimAutomation.Core
}
$ErrorActionPreference = "Continue"

Zuerst einmal schreiben wir uns in das Ausgabefenster das wir jetzt versuchen das VMWare Snapin zu laden. In der 2. Zeile schalten wir kurzzeitig das Errorreporting ab. In der 3. Zeile prüfen wir ob ein Snapin mit entsprechenden Namen vorhanden ist. Das ist übrigens auch der Grund warum wir das Errorreporting kurzzeitig abschalten. Wenn das Snapin noch nicht geladen wurde, würde die Zeile 3 einen Fehler bzw. eine Warnung produzieren. Diese kann aber ignoriert werden. Wenn das Snapin noch nicht geladen wurde so wird dies in Zeile 5 nachgeholt und zu guter Letzt wird das Errorreporting wieder angeschalten.
So, damit haben wir zumindest schon mal das Power CLI von VMWare geladen.
Diesen Schritt kann man natürlich auch umgehen indem man das CLI permanent in der Powershell vorhält. Ich bin aber kein Freund von zuvielen Snapins, das macht das System nur langsam und man benötigt es auch nicht immer.

Was man einmal geladen hat, sollte man auch wieder nach Gebrauch entladen. Das erledigt dieser Codeschnippsel:

Write-Host "Entlade VMWare SnapIn"
$ErrorActionPreference = "SilentlyContinue"
$VMWareSnapInLoaded = Get-PSSnapin -Name "VMware.VimAutomation.Core"
if ($VMWareSnapInLoaded) {
    Remove-PSSnapin VMware.VimAutomation.Core
}
$ErrorActionPreference = "Continue"

Hier hat sich nicht wirklich viel getan. Lediglich in Zeile 5 wird das Snapin entladen und unsere Powershell ist wieder schlank.
Bisher haben wir ja nun noch nicht wirklich viel gesehen. Kommen wir nun also zu den Informationen die wir uns anzeigen lassen wollen. Zuerst müssen wir uns mit dem vCenter verbinden:

$vCenterServer = "IP-Adresse oder Hostname"
$vCenterUser = "username"
$vCenterPass= "password"

Write-Host "Verbinde zum vCenter"
Connect-VIServer -Server $vCenterServer -user $vCenterUser -password $vCenterPass

$Datastores = Get-Datastore | Sort Name
ForEach ($Datastore in $Datastores) {
    Write-Host "Lese Datastore: " $Datastore.Name
}

$VMs = Get-VM | Sort Name
ForEach ($VM in $VMs) {
    Write-Host "Lese VM :" $VM.Name
}

Disconnect-VIServer -Server $vCenterServer

Dieses kleine CodeSchnippsel bringt uns erst einmal lediglich eine Auflistung aller vorhandenen Datastores und VMs, jeweils sortiert nach Name.
Aber die Schritte im einzelnen:
Wir bauen uns erst mal Variablen mit Host, User und Passwort. Dieser Schritt ist nicht notwendig, dient aber zur besseren Wiederverwertbarkeit des Codes. In Zeile 6 verbinden wir zum vCenter. Es sei noch angemerkt das dies auch funktioniert wenn nur ein einzelner ESX bzw. ESXi abgefragt werden soll. Es muss also nicht unbedingt ein vCenter sein.
In Zeile 10 und 15 werden die für uns relevanten Informationen ausgespuckt. Jegliche Ausgabe erfolgt hier in der Powershellkonsole. Bezüglich der Ausgabe noch ein paar Worte. Der Fantasie des Nutzers sind hierbei keine Grenzen gesetzt. Mein Output erfolgt bei mir immer in eine Exceltabelle mit mehreren Arbeitsblättern fein säuberlich strukturiert und geordnet, hübsch garniert mit zusätzlichen Informationen und schon fertig berechnet. Wie das alles funktioniert folgt in einem weiteren Beitrag.