пятница, 18 июня 2010 г.

Тушим все по команде UPS

Один из часто задаваемых вопросов - поддерживается ли работа vSphere с UPS? К сожалению нет, и интеграцию придется делать вручную.
Можно использовать например ghettoUPSHostShutdown.pl, но можно использовать и PowerCLI.

Что для этого требуется:
  1. Иметь Windows хост (или ВМ), следящую за ИБП. Как вариант - повесить эту задачу на vCenter (если он физический).
  2. При пропадании питания вызвать скрипт, который погасит инфраструктуру.
  3. При восстановлении питания поднять инфраструктуру, а затем ВМ.


Итак, вариант 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 комментариев:

  1. В качестве UPS подразумеваются исключительно девайсы с сетевым интерфейсом?

    ОтветитьУдалить
  2. Насколько, по вашему мнению, такой вариант надежен как enterprise решение по сравнению с тем же ghettoUPSHostShutdown.pl и\или платному решению от APC? Спасибо.

    ОтветитьУдалить
  3. Андрей Вахитов, выше только скрипт, который запускается по сигналу бесперебойника. Каким образом получать сигнал, по сети ли, юсб или serial дело другое. Ясно одно - юсб пробросить в виртуальную среду возможности нет.

    ОтветитьУдалить
  4. Анонимный, моей целью в данном случае не была разработка сверхнадежного Enterprise решения, а лишь демострация как это можно сделать на PowerShell.

    О пробросе USB подробно тут: http://blog.vadmin.ru/2010/04/usb.html

    + по слухам через месяц-два проброс USB штатными средствами появится в vSphere 4.1

    ОтветитьУдалить
  5. Anton,ок, а можно поинтересоваться с какими работающими решениями вы сталкивались? Неужели все используют ghettoUPSHostShutdown.pl?

    Мне интересно почему эта тема так мало освещена и готовых решений практически нет.

    ОтветитьУдалить
  6. Лично я вообще ни с чем не сталкивался, у нас стоят БОЛЬШИЕ упсы и ДГУ.
    Тема навеяна обсуждением на форуме VMware: http://communities.vmware.com/thread/260468?tstart=0

    ОтветитьУдалить
  7. а вот Microsoft Hyper-V умеет это делать стандартными средствами =)

    ОтветитьУдалить
  8. Ну хоть один плюс у Hyper-V нашелся.

    Кстати, Hyper-V или все таки SCVMM?

    ОтветитьУдалить
  9. А вот интересный аспект данного вопроса (так до сих пор мной и не разрешенный): скрипт на PowerCLI затруднений не вызвал - написал именно такой, какой нужен был лично для меня. Проверил - работает. Чудесно. Написал пакетник, который вызывает PowerShell - PowerCLI - скрипт. Шмякнул руками по нему - прекрасно работает. Ну, ерунда осталась: берем монитор UPSника, настраиваем, указываем ему наш пакетник, который он должен запустить перед отключением. Пробуем - не работает. Клиническая картина: процесс PowerShell запустился, однако повис ничего не делая. Сначала думал, что дело в том, что он запускается под SYSTEM. Нашел cpau, пробовал с ним - то же самое: PowerShell под админом в процессах без признаков жизни...
    Пришлось порыться в процессах, и обнаружилось (очевидная, в принципе, вещь, но сразу как-то не догнал...), что при ручном запуске пакетника процесс PowerShell является дочерним процесса explorer, и, как следствие, PowerShell в Security имеет группу NT AUTHORITY\интерактивные и наш PowerShell благополучно порождает всеразличные потоки. Если же пакетник запускается программой монитора UPS, то PowerShell является дочерним процесса services и, как следствие, в Security вместо NT AUTHORITY\интерактивные имеет NT AUTHORITY\служба. В результате процесс PowerShell висит в памяти и никаких потоков, естественно, не порождает. Разобраться-то я с этим разобрался, но вот что теперь делать - ума не приложу... Скрипт есть рабочий, выбрасывать жалко, как заставить сработать PowerShell под services - не знаю... В общем - чемодан без ручки...

    ОтветитьУдалить