Shutdown von VMware ESXi-Hosts und VMs mit PowerCLI-Script

Für den Fall eines längeren Stromausfalls, den die USV nicht überbrücken kann, sollte die virtuelle Infrastruktur automatisch heruntergefahren werden, um Schaden zu vermeiden. Eingebunden in die USV-Software kann das folgende PowerCLI-Skript diese Aufgabe übernehmen.

Ablauf

Das Skript ermittelt alle laufenden VMs und fährt diese, gemäß der am ESX-Host vorgegebenen Reihenfolge, herunter; ist der Shutdown wegen fehlender/nicht laufender VMware Tools nicht möglich, wird die VM ausgeschaltet. Nachdem das Skript den Shutdown-Vorgang aller Gastsysteme angestoßen hat, wartet es bis die VMs heruntergefahren sind, oder die maximale Skriptlaufzeit überschritten wurde. Ist dieser Zeitpunkt erreicht, führt es den Shutdown der ESXi-Hosts durch.

Mit einer vSphere Hypervisor (Free ESXi)-Lizenz kann das Skript nicht genutzt werden.

Konfiguration

Zur Konfiguration wurden im oberen Teil des Skripts folgende Variablen hinterlegt:

$VIServer– Hier wird der vCenter-/ESXi-Server hinterlegt, über den die Verbindung hergestellt wird.
$credFile– Zur Authentifizierung am vCenter-/ESXi-Server können Anmeldedaten hinterlegt werden.
$datacenterFilter auf bestimmte Datacenter („*“ = alle Datacenter).
$clusterFilter auf bestimmte Cluster („*“ = alle Cluster).
$VMhostsFilter auf bestimmte Hosts („*“ = alle Hosts).
$shutdownDelay– Zusätzliche Verzögerung in Sekunden zwischen dem Shutdown der einzelnen VMs.
$maxWaitVMs– Maximale Skriptlaufzeit bis zum Herunterfahren der ESXi-Hosts in Sekunden.
$testDelay– Zusätzliche Verzögerung in Sekunden zwischen den einzelnen Prüfungen des PowerState der VMs.
$shutdownInOrder– Herunterfahren der VMs in ($true)/entgegen ($false) der am Host vorgegebenen Startreihenfolge.
$excludeVMs– Liste von VMs, die nicht heruntergefahren werden (mit dem Host beendet).

Verbindung

Wird keine Verbindung zu einem vCenter-Server, sondern direkt zu einem ESXi-Host aufgebaut, ist es notwendig Zeile 46 auszukommentieren und statt dessen Zeile 47 zu nutzen.

Authentifizierung

Hat der ausführende Benutzer keine Berechtigung zur Verbindung mit dem Server kann über die Variable $credFile ein VICredentialStoreItem zur Authentifizierung genutzt werden. Erstellen kann man die Datei in der PowerCLI mit dem Befehl:

New-VICredentialStoreItem -host <Server IP/Name> -user <Benutzername> -password <Passwort> -file <Datei>

Der im Befehl angegebene Host wird im Skript nicht zur Verbindung verwendet; er wird durch $VIServer bestimmt.

Der Befehl muss unter dem ausführenden Benutzer ausgeführt werden, da das in der Datei verschlüsselte Passwort von anderen Benutzern nicht wieder entschlüsselt werden kann. Soll das Skript unter dem Benutzer NT-Authorität\System ausgeführt werden kann die PowerCLI-Shell mit dem Sysinternals-Tool PSExec gestartet werden, um eine passende Datei zu erstellen:

PSexec.exe -i -s C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -psc „C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\vim.psc1“ -noe -c „. \“C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1\““

(Pfade müssen ggf. angepasst werden -> s. Verknüpfung „VMware vSphere PowerCLI“)

Skriptausführung

Das PowerCLI-Skript kann, z.B. in einer Batch-Datei, mit folgendem Befehl aufgerufen werden:

C:\WINDOWS\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -psc „C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\vim.psc1“ -Command <Pfad>\PowerCLI-Shutdown.ps1

(Pfade müssen ggf. angepasst werden.)

Um mehrere Instanzen des Skripts parallel zu starten kann in einer Batch-Datei vor dem jeweiligen Befehl start.exe gesetzt werden:

start.exe <Befehl1>
start.exe <Befehl2>

Die Ausgabe kann mit >> in eine Textdatei geschrieben werden:

<Befehl> >> <LogFile>

Bei Verwendung der start.exe muss der Parameter /B angehängt werden, um die Ausgabe in eine Datei umzuleiten:

start.exe /B <Befehl> >> <LogFile>

Da die Ausführung von nicht-signierten Skripten standardmäßig nicht erlaubt ist, muss auf dem ausführenden System die Powershell ExecutionPolicy einmalig geändert werden:

Set-ExecutionPolicy RemoteSigned

Außerdem ist es ggf. notwendig das Powershell-Skript in den Dateieigenschaften zu entsperren:

Dateieigenschaften Powershell-Skript -> Sicherheit: Die Datei stammt von einem anderen Computer. Der Zugriff wurde aus Sicherheitsgründen eventuell blockiert. -> Zulassen

Weitere Fehler, die Auftreten können:

– Aufgrund umpassender Proxyeinstellungen kann bei der Verbindung folgendes Problem auftreten:

Connect-VIServer : <date> <time>    Connect-VIServer        Could not connect using the requested protocol.
+ Connect-VIServer <<<<  <VIServer>
+ CategoryInfo          : ObjectNotFound: (:) [Connect-VIServer], ViServer
ConnectionException
+ FullyQualifiedErrorId : Client20_ConnectivityServiceImpl_Reconnect_ProtocolError,
VMware.VimAutomation.ViCore.Cmdlets.Commands.ConnectVIServer

Um die aktuellen Einstellung der PowerCLI zu ermitteln, kann der Befehler Get-PowerCLIConfiguration verwendet werden. Ist die Policy auf den Wert UseSystemProxy gesetzt, kann das Problem entweder durch Korrektur der Windows-Proxyeinstellungen behoben, oder – wenn kein Proxy benötigt wird – die Verwendung eines Proxys mit folgendem Befehl deaktiviert werden:

Set-PowerCLIConfiguration -ProxyPolicy NoProxy

– Unter Windows 2003/XP mit ESXi 5.5-Hosts kann diese Meldung auftreten:

Connect-VIServer : <date> <time>    Connect-VIServer        The underlying connection was closed: An unexpected error occurred on a send.
+ Connect-VIServer <<<<  <VIServer>
+ CategoryInfo          : NotSpecified: (:) [Connect-VIServer], ViError
+ FullyQualifiedErrorId : Client20_ConnectivityServiceImpl_Reconnect_WebEx
ception,VMware.VimAutomation.ViCore.Cmdlets.Commands.ConnectVIServer

Behoben werden kann sie durch Installation des Microsoft Hotfix KB948963 (s. auch VMware KB2031053)

Filter

Um nicht alle vom vCenter-Server verwalteten Hosts/VMs herunterzufahren, sondern nur einen bestimmten Cluster oder Datacenter kann die Auswahl über die Variablen $datacenter, $cluster und $VMhosts gefiltert, oder auch einzelne VMs über $excludeVMs vom Shutdown ausgeschlossen werden.

 

Natürlich sollte man sich vor dem produktiven Einsatz ausgiebig in einer Testumgebung mit dem Skript auseinandersetzen – ggf. mit Auskommentierung der Shutdown-Befehle (Zeilen 64, 69 und 121) – und die definierbaren Delays und die Gesamtlaufzeit mit Sorgfalt planen.

Download

Links

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne
(16 Bewertungen, ⌀: 4,80 / 5)
Loading...

10 Kommentare

  1. ESX / ESXi - Hilfethread - Seite 97

    […] man das wohl mit VB machen, aber hab davon echt keinen Plan. Das PowerCli Script ist von hier: Shutdown von VMware ESXi-Hosts und VMs mit PowerCLI-Script | blog.bistron.eu […]

  2. Joerg Mothes

    Hallo Dennis,
    dein Skript PowerCLI_Shutdown.ps1 ist genial. Soweit funktioniert es sehr gut. Nunmehr haben ich ein Frage an dich. Vielleicht kannst du helfen?

    Eine zusätzliches Ziel ist es, dass Skript so „umzubiegen“, dass
    — im ersten Schritt die „nicht-excludedVMs“ herunterfahren …
    — dann eine definierte Zeit warten ..
    — im zweiten Schritt die „excludedVMs“ herunterfahren …
    — zum Schluss die ESX-Hosts herunterfahren

    Kannst du helfen oder hast du einen Tipp wie man das realisieren kann?

    VG
    Joerg

  3. Daniel Kulka

    Hallo,

    gäbe es eine Möglichkeit VMs, die im vCenter unter gewissen VM Ordnern liegen priorisiert runterzufahren? Also den Ordner „Testlab“ als letztes und den Ordner „Produktion“ als erstes?

    Gruß,
    Daniel

    • Dennis Bistron

      Hallo Daniel,

      ohne Anpassungen ist es nicht möglich Ordner zu priorisieren.

      Die einzige Option, um die Reihenfolge zu beeinflussen, ist z.Z. die Festlegung der Startreihenfolge am ESXi-Host (+ $shutdownInOrder).

      MfG

  4. Marco

    Hallo Dennis,

    sehr interessanter Ansatz, nachdem der Shutdown-Wizard meiner Powerwalker-USV so gar nicht wirklich laufen will.

    Ich habe meinen ESXI-Host direkt eingetragen, leider funktioniert das Script nicht wirklich: Er sieht zwar die beiden laufenden VM’s, es wird aber nichts heruntergefahren. Vorher kommt auch eine Fehlermeldung:

    Name Port User
    —- —- —-
    10.0.1.100 443 root
    2014-10-05 16:35:45 CollectEnvData
    Get-VMStartPolicy : 05.10.2014 16:35:48 Get-VMStartPolicy Der angefor
    derte Wert „systemDefault“ konnte nicht gefunden werden.
    Bei C:PowerWalker2.12PowerCLI-Shutdown.ps1:51 Zeichen:47
    + $shutdownOrder = $ESXHosts | Get-VMStartPolicy <<<< | Sort-Object -Property
    @{Expression="StartAction";Descending=$true},@{Expression="StartOrder";Ascendin
    g=$shutdownInOrder}
    + CategoryInfo : NotSpecified: (:) [Get-VMStartPolicy], VimExcept
    ion
    + FullyQualifiedErrorId : Core_BaseCmdlet_UnknownError,VMware.VimAutomatio
    n.ViCore.Cmdlets.Commands.Host.GetVMStartPolicy

    2014-10-05 16:35:48 ExcludedVMsOnl
    2014-10-05 16:35:48 Waiting 2/2 VMs online / 00:03:50.1734380 left…

    So I guess there is a problem with "Get-VMStartPolicy" … from the vSphere documentation I also understand that this command does not work on a single ESXI host?

    Is there any modification which works without this?

    • Dennis Bistron

      Hallo,
      nachdem ich einen Kommentar von Max im VMware PowerCLI Blog gefunden hatte, konnte ich das Problem nachstellen.

      Wie dort beschrieben tritt der Fehler nur auf, wenn in der vmAutoStart.xml (auf dem ESXi-Host unter /etc/vmware/hostd/) für stopAction der Wert systemDefault mit kleinem „s“ steht (bei waitForHeartbeat scheint es nicht zu stören).

      Demnach könntest Du Dir mal die Einträge in Deiner vmAutoStart.xml ansehen und sie ggf. entsprechend anzupassen. Nach einem Neustart des hostd, sollte das Skript ohne Fehler laufen.

      Auch wenn bei meinem Test keine Probleme auftraten: bitte zumindest erst auf einem Testsystem nachstellen und die Sicherungskopie der vmAutoStart.xml nicht vergessen… im Zweifel besser den VMware-Support kontaktieren 😉

      MfG

  5. munterhuber

    Nach der Anpassung der vmAutoStart.xml funktioniert das Script genau so wie es soll!
    Vielen Dank nochmals, somit erspare ich mir jetzt die vMA. 😀 😀

  6. Björn

    Hallo Dennis,

    nach meinen ersten ‚Gehversuchen‘, habe ich das Script bis Zeile 50 zum Lafen bekommen, aber da passiert etwas, dass ich auch beim Lesen des Codes nicht verstehe. Mir wird gemeldet, dass Get-VM ein Argument für Datastore bekommt, dass leer oder NULL ist. Danach purzeln weitere Fehler, die vermutlich aber folgefehler sind rein. Ich kenne mich leider mit PowerCLI zu wenig aus, um hier den Debugger anzuwerfen. Die Ausgabe bis Fehlermeldung ist exakt folgende:
    ———-
    2015-04-29 08:19:49 *** StartShutdownScript ***
    2015-04-29 08:19:49 ConnectVIServer

    Name Port User
    —- —- —-
    192.168.110.52 443 root
    2015-04-29 08:19:50 CollectEnvData
    Get-VM : Das Argument für den Parameter „Datastore“ kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, das nicht NULL oder leer ist, und führen Sie dann den Befehl erneut aus.
    Bei P:CLIPowerCLI-Shutdown.ps1:50 Zeichen:32
    + $VMsOnline = $ESXHosts | Get-VM <<<< | Where {$_.PowerState -eq "poweredOn"}
    + CategoryInfo : InvalidData: (:) [Get-VM], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,VMware.VimAutomation.ViCore.Cmdlets.Commands.GetVM
    ———-

    Hast DU dazu eine Idee?

    Lieben Dank und beste Grüße! 🙂

    • Dennis Bistron

      Hallo Björn,

      den Fehler habe ich bisher noch nicht gehabt und auch meine (zugegebenermaßen nur kurze) Suche hat nichts wirklich Hilfreiches zutage gefördert.
      Wenn Du magst, kannst Du mir aber über das Kontaktformular noch eine nähere Beschreibung zum Aufbau Deiner Umgebung und der verwendeten Software (Version vCenter, ESXi, PowerCLI, …) schicken.
      Sende Dir später auch noch eine Mail, wie Du das Problem evtl. noch ein wenig eingrenzen kannst.

      MfG

  7. Krom

    Hallo,

    gibt es auch eine Lösung für ESXi Hosts im HA-Cluster ? Wenn HA aktiviert wird ist die Shutdown Order die man im ESXi Host einträgt unwirksam bzw. wird automat. deaktiviert.

Kommentar verfassen

Neue Beiträge Oft gelesene BeiträgeNeueste KommentareBlog abonnieren

Gib Deine E-Mail-Adresse an, um diesen Blog zu abonnieren und Benachrichtigungen über neue Beiträge via E-Mail zu erhalten.