Можно использовать например ghettoUPSHostShutdown.pl, но можно использовать и PowerCLI.
Что для этого требуется:
- Иметь Windows хост (или ВМ), следящую за ИБП. Как вариант - повесить эту задачу на vCenter (если он физический).
- При пропадании питания вызвать скрипт, который погасит инфраструктуру.
- При восстановлении питания поднять инфраструктуру, а затем ВМ.
Итак, вариант 1. vCenter расположен на физической машине.
Get-VM | Where-Object {$_.PowerState -eq "PoweredOn" -and $_.Guest.State -eq "Running"} | Shutdown-VMGuest
Start-Sleep -Seconds 300
Get-VM | Where-Object {$_.PowerState -eq "PoweredOn"} | Stop-VM -RunAsync
Start-Sleep -Seconds 60
Get-VMHost | ForEach-Object {
Set-VMHost -vmhost $_ -state maintenance
Stop-VMHost -vmhost $_ -RunAsync
}Вариант 2. vCenter расположен на виртуальной машине. В этом случае сначала выключаем vCenter, чтобы избежать потенциального влияния DRS. Например так:Get-VM -Name "vCenter" | %{
if ($_.PowerState -eq "PoweredOn") {
if ($_.Guest.State -eq "Running") {
Shutdown-VMGuest
} else {
Stop-VM -RunAsync
}
}
}Можно использовать cтандартные средства Windows:shutdown /s /t 0 /m \\vcenterИ для каждого физического хоста вызываем такой скрипт:
Get-VM | Where-Object {$_.PowerState -eq "PoweredOn" -and $_.Guest.State -eq "Running"} | Shutdown-VMGuest
Start-Sleep -Seconds 300
Get-VM | Where-Object {$_.PowerState -eq "PoweredOn"} | Stop-VM -RunAsync
Start-Sleep -Seconds 60
Get-VMHost | Stop-VMHost -RunAsync
Есть вариации на тему автоматического рестарта ВМ при восстановлении питания, однако на мой взгляд это может привести к проблемам, если не учитывать взаимные зависимости ВМ и отправить в массовый старт пару сотен виртуальных машин. С другой стороны, никто не мешает автоматически поднять только vCenter и инфраструктурные машины типа контроллеров домена и DNS (если нет физических), а затем вызвать ваш собственный скрипт для поднятия всех машин в нужном вам порядке и с нужными вам задержками.
9 коммент.: