Используем PowerShell для выполнения последовательного завершения работы сервера Hyper-V и его виртуальных машин – Hey, Scripting Guy! Blog

Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает о том, как завершить работу всех виртуальных машин перед тем как отключить сервер Hyper-V.

Получаем список виртуальных машин

Первое, что необходимо сделать – это получить список активных виртуальных машин на хосте Hyper-V. Это мы можем сделать, запросив командлет Get-VM с указанием имени сервера Hyper-V, и передав результаты командлету Where-Object для получения только тех виртуальных машин, чье состояние равно ‘running’.

$runningVM = Get-VM -ComputerName $vmhost| where state -eq ‘running’

Поскольку на хосте Hyper-V обычно выполняется несколько виртуальных машин, я воспользуюсь конструкцией ForEach, для того, чтобы обработать каждую виртуальную машину из переменной $RunningVM. Внутри цикла я создам событие WMI (WMI Event), использующее класс Win32_ComputerShutdownEvent, для того чтобы я мог узнать, что определенная виртуальная машина завершила работу. Код приведен ниже.

foreach ($cn in $runningVM)

{

Write-Debug «registering shutdown event for $($cn.name)»

Register-WmiEvent -Class win32_ComputerShutdownEvent -ComputerName $cn.name `

-SourceIdentifier $cn.name.tostring()

После того, как я зарегистрировал событие, я запускаю командлет Stop-Computer, чтобы начать процедуру выключения виртуальной машины.

Write-debug «Shutting down $($cn.name)»

Stop-Computer -ComputerName $cn.name –Force

Поскольку я зарегистрировал событие Win32_ComputerShutdownEvent виртуальной машины, при ее выключении сработает триггер. Для получения сообщения о событии я использую командлет Wait-Event.

Write-Debug «Waiting for shutdown to complete»

Wait-Event -SourceIdentifier $cn.Name.ToString()}

После выключения всех виртуальных машин можно завершить работу хоста Hyper-V. Для этого я опять воспользуюсь командлетом Stop-Computer.

Write-Debug «Shuting down $vmhost»

Stop-Computer -ComputerName $vmhost –Force

Отслеживаем выполнение скрипта

Поскольку я вызываю завершение работы удаленных машин и я хочу знать, что происходит в тот или иной момент времени, я добавил в скрипт несколько команд Write-Debug. Это довольно просто. В случае, если вы запускаете скрипт без ключа –Debug, выводится только основная информация. При указании ключа –Debug, выводятся запросы на выполнение каждого действия. Возможно, подобная интерактивность – это не то, что вам нужно. Если вы хотите получать информацию о каждом действии без необходимости его подтверждать – вместо командлета Write-Debug вы можете использовать командлет Write-Verbose. Принцип их работы во многом одинаков. Они становятся доступными после указания в скрипте строки [cmdletbinding()].

Заметка: Во время тестирования я заметил, что порой скрипт подвисает. Это происходит когда виртуальные машины выключаются быстрее, чем я успеваю нажать “y” для подтверждения выполнения следующего шага и, таким образом, командлет Wait-Event ожидает сообщения о событии которое уже произошло.

После тестирования скрипта я понял, что устал все время нажимать “y”, поэтому я поменял все командлеты Write-Debug на Write-Verbose. Также я решил, что не помешает удалить остающиеся объекты событий и добавил следующий код:

Get-Event -SourceIdentifier $cn.name.Tostring() | Remove-Event

Обновленная версия скрипта приведена ниже:

[cmdletbinding()]

Param($vmhost = ‘hyperv2’)

Write-Verbose «getting running VM’s on $vmhost»

$runningVM = Get-VM -ComputerName $vmhost| where state -eq ‘running’

foreach ($cn in $runningVM)

{

Write-Verbose «registering shutdown event for $($cn.name)»

Register-WmiEvent -Class win32_ComputerShutdownEvent -ComputerName $cn.name `

-SourceIdentifier $cn.name.tostring()

Write-Verbose «Shutting down $($cn.name)»

Stop-Computer -ComputerName $cn.name -Force

Write-Verbose «Waiting for shutdown to complete»

Wait-Event -SourceIdentifier $cn.Name.ToString()

Get-Event -SourceIdentifier $cn.name.Tostring() | Remove-Event}

Write-Verbose «Shuting down $vmhost»

Stop-Computer -ComputerName $vmhost –Force

При его запуске выводится следующее.

01

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/02/21/use-powershell-to-perform-an-orderly-shut-down-of-a-hyper-v-server.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s