Upload und Installation von ESXi Patch mit PowerCLI

Das Skript, dass ich vor kurzem erstellt habe ist etwas mehr als nur Upload und Installation von ESXi Patch mit PowerCLI. Ich verwende für die Installation die esxcli, welche über das VMware PowerCLI ESXCLI v2 Cmdlet angesprochen wird (keine SSH Verbindung erforderlich). Diese Methode ermöglicht es mir, nicht nur VIB Upgrades sondern auch Downgrades durchzuführen. Das Install-VMHostPatch PowerCLI Cmdlet, welches für die Installation von ESXi Patches mit PowerShell üblich wäre, kann leider nur Upgrades durchführen. Das gilt übrigens auch für den VMware vCenter Update Manager.

Upload und Installation von ESXi Patch mit PowerCLI - Log Output

Nach der Installation des ESXi Patches wird die Rückgabe der esxcli geprüft, ob ein Neustart des Hosts erforderlich ist. Wenn ja wird dieser direkt durchgeführt.

Mein initialer Usecase für dieses Skript war es übrigens, Netzwerktreiber in einem kompletten vCenter auf einen einheitlichen Stand zu bringen. Dafür habe ich die aktuellen Stände der ESXi Hosts vorher mit meiner NIC Driver and Firmware Funktion ausgewertet und die fehlerhaften Hosts auf die passende Treiber Version gebracht (konnte Down- oder Upgrade sein).

Upload und Installation von ESXi Patch mit PowerCLI Skript

Das PowerCLI Skript installiert auf allen ESXi Hostst im Cluster, die im Maintenance Mode sind, das Patch Bundle von einem Datenspeicher aus. Dafür wird das Zip File vor der Installation auf diesen Datenspeicher hochladen.

Variablen des Skripts:

Name Beschreibung Beispiel
ClusterName Name des vSphere Clusters „Compute01“
LocalPath Lokaler Pfad zum Patch Bundle „D:\Image\HPE-20180220.zip“
DepotName Name des Depot Zip Files „HPE-20180220.zip“
TempDatastoreName Name oder Wildcard des Datenspeichers „LOCAL*“

Für den Upload des Zip Files verwende ich die New-DatastoreDrive und Copy-DatastoreItem Cmdlets. Danach folgt die Installation per Get-ESXCLI -V2.

[String]$ClusterName = "Compute01"
[String]$LocalPath = "D:\Image\HPE-20180220.zip"
[String]$DepotName = "HPE-20180220.zip"
[String]$TempDatastoreName = "LOCAL*"

$VMhosts = Get-Cluster -Name $ClusterName | Get-VMHost | Where-Object {$_.ConnectionState -eq "Maintenance"}

foreach ($VMhost in $VMhosts) {
    #region: Upload Patch
    $Datastore =  $VMhost | Get-Datastore -Name $TempDatastoreName
    $DatastoreDriveName = "HostStore_" + $VMhost.Name.Split(".")[0]
    $Datastore | New-DatastoreDrive -Name $DatastoreDriveName | Out-Null
    Copy-DatastoreItem -Item $LocalPath -Destination $($DatastoreDriveName + ":\") -Force:$true -Confirm:$false
    Remove-PSDrive -Name $DatastoreDriveName
    #endregion

    #region: Install Host Patch
    $HostPath = $Datastore.ExtensionData.Info.Url.remove(0,5) + $DepotName
    $esxcli2 = Get-ESXCLI -VMHost $VMhost -V2
    $CreateArgs = $esxcli2.software.vib.install.CreateArgs()
    $CreateArgs.depot = $HostPath
    $InstallResponse = $esxcli2.software.vib.install.Invoke($CreateArgs)
    #endregion

    #region: Restart Host
    if ($InstallResponse.RebootRequired -eq $true) {
        Write-Host "Rebooting '$($VMHost.Name)'..."
        Write-Host "VIBs Installed:"
        $InstallResponse.VIBsInstalled

        $VMhost | Restart-VMHost -Confirm:$false | Out-Null    
    }
    else {
        Write-Host "No Reboot for '$($VMHost.Name)' required..."    
    }
    #endregion
}

Das Skript steht auch als GitHub Gist verfügbar.

Leave a Reply