[PowerCLI] Automating VM Shutdown triggered by USV
So another customer had a requirement. They want their USV to trigger a script that moves all VMs from one datacenter to the other datacenter in case of a power failure.
I started to write the following script, but it has not been finalized because some of the customer’s engineers are on holidays. I will update this post as soon as the final script is ready.
One thing to note: It uses the same VI Credential Store as my previous script to automate VM skeleton creation.
Update: this script is now published at GitHub.
############################################################################################ # Script name: EvacuateVMsFromUSV.ps1 # Description: Evacuate all VMs from one site in a active-active cluster and shut down the Hosts # Version: 1.0 # Date: 20.07.2017 # Author: Dario Doerflinger (virtualfrog.wordpress.com) # History: 20.07.2017 - First tested release ############################################################################################ # Example: # e.g.: .\EvacuateVMsFromUSV.ps1 -SiteToShutdown Allschwil param ( [string]$SiteToShutdown # Identifier of site ) $vCenter_server = "bezhvcs03.bechtlezh.ch" # clear global ERROR variable $Error.Clear() # import vmware related modules, get the credentials and connect to the vCenter server Import-Module -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue | Out-Null Import-Module -Name VMware.VimAutomation.Vds -ErrorAction SilentlyContinue |Out-Null $creds = Get-VICredentialStoreItem -file "C:\Users\Administrator\Desktop\login.creds" Connect-VIServer -Server $vCenter_server -User $creds.User -Password $creds.Password |Out-Null # define global variables $current_date = $(Get-Date -format "dd.MM.yyyy HH:mm:ss") $log_file = "C:\Users\Administrator\Desktop\\log_$(Get-Date -format "yyyyMMdd").txt" Function SetDRStoAutomatic ($cluster) { try { $cluster | Set-Cluster -DrsEnabled:$true -DrsAutomationLevel FullyAutomated -Confirm:$false |Out-Null } catch { Write-Host -Foregroundcolor:red "Could not set DRS Mode to automatic" } } Function RemoveRemovableMediaFromVMs($esxhost) { try { $esxhost | Get-VM | Where-Object {$_.PowerState –eq “PoweredOn”} | Get-CDDrive | Set-CDDrive -NoMedia -Confirm:$False |Out-Null } catch { Write-Host -Foregroundcolor:red "Could not get the vm objects from host." } } Function EvacuateVMsFromHost($esxhost) { try { $esxhost | Set-VMHost -State Maintenance -Evacuate:$true -Confirm:$false |Out-Null } catch { Write-Host -Foregroundcolor:red "Could not put host into maintenance mode" } } Function ShutDownHost($esxhost) { try { $esxhost | Stop-VMhost -Confirm:$false -Whatif } catch { Write-Host -Foregroundcolor:red "Could not shut down host" } } ###### Main Program ###### if ($SiteToShutdown -eq "Allschwil") { $hosts = @("bezhesx40.bechtlezh.ch") } elseif ($SiteToShutdown -eq "Pratteln") { $hosts = @("bezhesx41.bechtlezh.ch") } foreach ($esxhost in $hosts) { $cluster = (get-vmhost $esxhost).Parent SetDRStoAutomatic($cluster) $esxihost = Get-VMhost $esxhost RemoveRemovableMediaFromVMs($esxihost) EvacuateVMsFromHost($esxihost) ShutDownHost($esxihost) } # cleanup and removal of loaded VMware modules Disconnect-VIServer -Server $vCenter_server -Confirm:$false |Out-Null Remove-Module -Name VMware.VimAutomation.Vds -ErrorAction SilentlyContinue | Out-Null Remove-Module -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue | Out-Null # write all error messages to the log file Add-Content -Path $log_file -Value $Error
Leave a Reply