Одним из методов эффективного владения облачной инфраструктурой является выключение виртуальных ресурсов (ВМ) в нерабочие часы. В облаке Microsoft Azure имеется возможность выключать (stop and deallocate) ВМ с помощью Automation Accounts.
При помощи моего PowerShell скрипта Apply-AzVmPowerStatePolicyWf.ps1 вы сможете создать свой собственный Runbook и спланировать включение/выключение ваших Azure ВМ. Всё, что для этого потребуется - это создать 2 тега (Тags) PowerOn и PowerOff и задать им соответствующие значения для каждой ВМ, которую вы планируете включать/выключать по расписанию.
Учтите, что только те ВМ, у которых заданы оба этих тега, будут участвовать в процессе. Если определённые машины вы не планируете выключать вообще (только включать), то задайте тегу PowerOff значение «23:59:59».
Скрипт Apply-AzVmPowerStatePolicyWf.ps1 написан как PowerShell Workflow для параллельной обработки сразу всех ВМ. Как ни странно, на данный момент команды Start-AzureRmVm и Stop-AzureRmVm не поддерживают асинхронную обработку множества ВМ, поэтому мы вынуждены перенести этот функционал в сам скрипт. После того, как вы задали теги для всех требуемых машин, вы можете приступить к работе с Automation Account Resources.
На самом деле вам потребуется создать всего 3 ресурса:
Runbook.
Schedule Asset с параметрами.
Credential Asset.
Давайте начнём по порядку.
1. Добавить новый Runbook типа PowerShell Workflow. Правильный тип Runbook очень важен.
Обязательно! Имя Runbook должно быть точно таким же, как имя Workflow внутри скрипта (Apply-AzVmPowerStatePolicyWf). Если вас не устраивает это название, переименуйте Workflow в соответствии с названием вашего Runbook.
Разные типы Runbook имеют различные иконки для визуального отличия.
Отредактируйте ваш Runbook и вклейте (copy/paste) мой скрипт в поле CMDLET.
3. Создайте новый Schedule Asset для вашего Runbook.
Schedule Asset содержит не только сам планировщик, но и более важную вещь - параметры скрипта! Как вы можете видеть, скрипт Apply-AzVmPowerStatePolicyWf.ps1 содержит 5 параметров.
Имена параметров говорят сами за себя. Стоит отдельно поговорить только о двух из них: -AzureVmTimeZone и –WhatIf.
AzureVmTimeZone - это часовой пояс (Time zone) ваших ВМ. Подразумевается, что время включения/выключения машин в тегах PowerOn/PowerOff задано в локальном времени данного часового пояса!
Для получения всех существующих часовых поясов, запустите следующую команду на своём компьютере: [System.TimeZoneInfo]::GetSystemTimeZones() |Format-Table –AutoSize
Используйте значение из колонки Id для своего часового пояса.
WhatIf - это флаговый параметр. При его использовании (достаточно присвоить ему значение True), реального включения/выключения не произойдёт, вы только получите отчёт о том, чтобы произошло, если бы вы запустили скрипт сейчас.
Каждый запуск Runbook создаёт задачу (Job), после окончания которой, вы сможете просмотреть её статистику: Errors, Warnings, Logs и Output.
Кликните на кубике Output, и вы увидите отчёт обо всех ваших машинах. Обратите внимание на свойство StatusCode. Оно может принимать значения «OK», «Error» или быть пустым, когда свойство StatusChange будет «NotRequired».
Если вы получаете «Error» в свойстве StatusCode, проверьте значения PowerOn и PowerOff, возможно одно из них не задано или содержит некорректную величину.
Параллельно с написанием этой статьи, я создал Azure репозиторий на GitHub, который будет регулярно пополняться новыми скриптами и функциями.
Мой Azure PowerShell модуль Az-Module.psm1 уже содержит одну функцию для работы с тегами - Get-AzVmTag. В ближайшее время он пополнится функцией для автоматизации работы с тегами, в данный момент она тестируется. По этому поводу обязательно будет отдельная статья.
Следующий код выдаст вам значения тегов PowerOn и PowerOff для всех машин в Resource Group (не забудьте задать переменную $MyAzureResourceGroup):