Stisknutím tlačítka "Enter" přeskočíte na obsah

Reconfig Nested ESXi – PowerCli

Už se Vám možná někdy stalo, že jste potřebovali změnit konfiguraci Nested ESXi hosta, kterou ale nemůžete udělat za běhu. Ne že by to nešlo, ale pokud potřebujete udělat rekonfiguraci na vícero hostech stejnou, tak to nějakou chvíli zabere. Pokud ještě ta rekonfigurace vyžaduje mít VM vypnutou, tak je to o to větší zdržení.

Já na jedno takové narazil, když jsem si hrál s HoloDesk labem. Všechny Nested hosty, se totiž automaticky vytváří s firmware typu BIOS, ale při upgrade vám to bude hlásit, že Legacy BIOS je deprecated a měli byste přejít na EFI. Řeknete si, žádný problém, tak prostě jeden host po druhém vypnu, následně udělám změnu a zase zapnu, ale dělejte to u třeba 4 hostů postupně. Už je to přece jen nějaký strávený čas.

A tak jsem se rozhodl si napsat script.

Výhoda PowerCLI je v tom, že můžete být připojeni současně k několika vCenter v jednu chvíli. Pak jen při spouštění vyhledávacích Commandletů jen zadat proti kterému vCenter to chcete spustit. Je k tomu parametr -Server

Přikládám Script, který se připojí k vašemu Nested vCenter i Fyzickému vCenter, převede hosta, do Maintenance mode, korektně vypne, jakmile se vypne i VM, tak udělá reconfig, znovu zapne a počká, až se host v Nested vCenter zase připojí. Následne převede host z Maintenance a pokračuje na dalšího.

$NestConnect = Connect-VIServer vcenter-wld.vcf.sddc.lab
$PhyConnect = Connect-VIserver vcenter.physicaldemo.local

# Any reconfig specification, that needs to be done on Nested ESXi VM while poweredOff
$specEfi =  New-Object VMware.Vim.VirtualMachineConfigSpec
$specEfi.Firmware = [VMware.Vim.GuestOsDescriptorFirmwareType]::efi 

$NestHosts = Get-VMhost -Server $NestConnect

foreach ($NestHost in $NestHosts) {
    # working with ViewType is faster
    $NestHost_v = Get-View -VIObject $NestHost
    
    $NestHost_v.EnterMaintenanceMode(1800,$true,$null)
    
    sleep 5

    $NestHost_v.ShutdownHost($false)

    $nestHostVM_v = Get-View -ViewType VirtualMachine -Server $PhyConnect -Filter @{'Config.Uuid'="$($NestHost_v.Hardware.SystemInfo.Uuid.Substring(18))"}
    # Wait for VM powered Off
    do {
        sleep 5
        $nestHostVM_v.UpdateViewData()
    } while ($nestHostVM_v.Runtime.Powerstate -ne "poweredOff")

    sleep 2

    $nestHostVM_v.ReconfigVM($specEfi)

    sleep 2

    # Wait till the vCenter Timeout recognize, that Host is disconnected
    do {
        sleep 5
        $NestHost_v.UpdateViewData()
    } while ($NestHost_v.Runtime.ConnectionState -eq "connected")

    $NestHostVM_v.PowerOnVM($null)

    # Wait for host is connected again
    do {
        sleep 5
        $NestHost_v.UpdateViewData()
    } while ($NestHost_v.Runtime.ConnectionState -ne "connected")

    $NestHost_v.ExitMaintenanceMode(1800)

    # vSAN stabilize
    sleep 10
}

Nejzajímavější bylo, zjisit správnou VM, kterou chceme překonfigurovat. Využil jsem toho, že Bios UUID jsem schopen vytáhnout jak z Nested ESXi, tak z konfigurace VM. Akorát jsou oba záznamy na první pohled trochu pomotané. Mají ale stejný konec, tak jsem to pro zjednodušení použil.

A ještě malý bonus. Zjištění jestli Vám ESXi host běží nad UEFI nebo Legacy BIOS:

vsish -e get /hardware/firmwareType