В первой части статьи, опубликованной в Windows IT Pro/RE № 9 за 2017 год, я рассказал о том, что такое масштабируемые наборы, как они функционируют и что можно с ними делать. Мы рассмотрели метод создания масштабируемых наборов вручную через портал Azure. Это хороший способ начать, если вам требуется множество виртуальных машин для выполнения какой-либо задачи. Во второй части мы продолжим тему и выясним, как построить масштабируемые наборы из командной строки и как настроить рабочие виртуальные машины масштабируемого набора с помощью PowerShell и шаблонов.

Основные сведения о командной строке масштабируемого набора

Компания Microsoft превосходно справилась с задачей сделать вычислительные службы Azure доступными на нескольких платформах. Вы можете использовать пакет интерфейса командной строки Azure (Azure CLI) или Azure PowerShell для создания, изменения, эксплуатации и удаления масштабируемых наборов. Выбор инструмента зависит от двух факторов: ваших предпочтений и наличия Azure PowerShell на целевой платформе. Я предпочитаю PowerShell, так как могу сочетать Azure, Windows и Office 365 PowerShell в одном сеансе, и он мне нравится больше, чем язык сценариев bash. Поэтому обычно я пользуюсь PowerShell. Однако уровень абстракции командного семейства az vmss гораздо выше: вы можете создать масштабируемый набор виртуальных машин с помощью одной команды az vmss, поскольку она позволяет подготовить подсистему балансировки нагрузки, сеть по умолчанию и другие необходимые объекты. Для сравнения, пример программного кода PowerShell, опубликованный компанией Microsoft, требует 17 строк кода. Но благодаря Azure PowerShell вы получаете полный контроль, так как можете задать каждый аспект создаваемого объекта. То же, как правило, верно и для всех остальных аспектов работы с масштабируемым набором: Azure PowerShell обеспечивает лучший контроль, но использовать az vmss проще. Какую бы версию инструмента командной строки вы ни выбрали, вы получите ее со страницы загрузки Azure SDK по адресу: https://azure.microsoft.com/en-us/downloads/.

Вместо того чтобы углубляться в детали создания масштабируемых наборов из командной строки, поделюсь секретом: проще и быстрее задействовать файлы шаблонов, точно указывающих, как построить нужный масштабируемый набор. Лучший способ повседневной работы с масштабируемыми наборами — подготовить шаблон, выполняющий необходимые функции, а затем воспользоваться командной строкой для управления существующим масштабируемым набором. Эту задачу мы и рассмотрим в данной статье.

Что необходимо знать о шаблонах

В масштабируемых наборах используется стандартная система шаблонов Azure Resource Manager. Это означает, что вы создадите файл JSON, в котором определены три основных элемента:

  • Набор параметров, который нужно передать в шаблон. Вы можете использовать его для настройки шаблона и расширений в процессе построения масштабируемого набора.
  • Набор переменных, которые можно задействовать для простых вычислений в шаблоне. Как и параметры, переменные не являются обязательными.
  • Набор определений ресурсов. Эти определения обязательны, так как они указывают, что именно должен строить шаблон.

Конечно, вы можете создавать собственные шаблоны с нуля, но есть куда более простой путь. Разработчики Azure составили библиотеку начальных шаблонов, которую можно найти по адресу: https://github.com/Azure/azure-quickstart-templates. С ее помощью вы можете без задержек начать работу с различными функциями Azure через интерфейс Azure Resource Manager (AzureRM). Библиотека шаблонов заслуживает внимания (в ней много остроумных решений), но нас больше всего интересуют шаблоны масштабируемого набора виртуальных машин. Для этой статьи я выбрал шаблон 201-vmss-windows-jumpbox, так как с его помощью можно сформировать масштабируемый набор с единственной виртуальной машиной Azure, к которой можно подключиться через протокол RDP и настроить ее. Это полезно, так как упрощается тонкая настройка параметров виртуальной машины; после того, как шаблон и масштабируемый набор построены в точном соответствии с вашими желаниями, вам, возможно, не потребуется доступ к отдельным виртуальным машинам. Вероятно, такой и должна быть ваша цель: получить масштабируемый набор, развертываемый полностью автоматически, без дополнительной настройки после установки.

Построение шаблона

Начните с обращения по адресу: https://github.com/Azure/azure-quickstart-templates/tree/master/201-vmss-windows-jumpbox и сохраните файл шаблона, затем откройте привычный текстовый редактор (мне очень нравится Notepad++, но подойдет любая программа, пригодная для редактирования файлов JSON). Если создать масштабируемый набор с помощью этого шаблона, то вы получите до 100 виртуальных машин Windows 2008 R2, Windows 2012 или Windows 2012 R2, а также отдельный защищенный административный компьютер (jumpbox). Сначала обеспечим поддержку Windows 2016. Найдите в блоке Parameters раздел с меткой windowsOSVersion и добавьте новый элемент к элементу allowedValues для Windows 2016, как показано на экране 1. Обратите внимание, что я еще изменил элемент defaultValue, чтобы получить Windows 2016 по умолчанию.

 

Подготовка шаблона
Экран 1. Подготовка шаблона

Затем определите размер нужного нам экземпляра виртуальной машины. Компания Microsoft предлагает большое разнообразие экземпляров виртуальной машины, в том числе экземпляры с несколькими ядрами процессора, мощными графическими процессорами и другими компонентами с добавочной стоимостью, которые не потребуются нам для тестирования. По адресу: https://docs.microsoft.com/en-us/azure/cloud-services/cloud-services-sizes-specs опубликовано полезное руководство по определению размеров, но для наших целей нужно что-нибудь недорогое и компактное, ведь мы занимаемся всего лишь тестированием. Размер экземпляра виртуальной машины, созданного для масштабируемого набора в этом шаблоне, определяется значением параметра vmSku. Мы выберем Standard_A1.

Кроме того, в блоке Parameters можно увидеть параметры, задаваемые во время создания масштабируемого набора: имя, количество виртуальных машин, имя пользователя и пароль администратора для виртуальных машин в масштабируемом наборе. В шаблоне по умолчанию всем машинам, в том числе административному компьютеру, назначается одно имя пользователя и пароль. Добавим новый набор параметров, чтобы назначить административному компьютеру отдельный набор учетных данных. Самый простой способ сделать это — скопировать и вставить блоки adminUsername и adminPassword и переименовать копии в jumpAdminUsername и jumpAdminPassword, как показано на экране 2.

 

Указание учетных данных для административного компьютера
Экран 2. Указание учетных данных для административного компьютера

Затем прокрутите экран вниз до блока Variables. Обратите внимание, что во многих переменных в качестве входных данных используется параметр; скажем переменная jumpboxName состоит из имени масштабируемого набора с добавленным в конце «jbox», например: «jumpBoxName»: «[concat (variables (‘namingInfix’), ‘jbox’)]».

Пока этих настроек достаточно для базового масштабируемого набора. Одно из преимуществ использования шаблонов состоит в том, что можно многократно изменять шаблон, испытывать его и вносить поправки по результатам испытаний. Этот процесс будет гораздо более сложным, если полагаться исключительно на командную строку.

Создание шаблонного масштабируемого набора с помощью PowerShell

После того как Azure PowerShell установлен, запустите программу, и вы будете готовы к работе масштабируемых наборов. Первый необходимый шаг — подключиться к Azure и выбрать подписку, которую вы собираетесь использовать для управления масштабируемыми наборами. Чтобы войти, воспользуйтесь командой Login-AzureRmAccount. Вы можете предоставить учетные данные со знакомым параметром -Credential. Если этого не сделать, вы увидите диалоговое окно входа на основе ADAL для проверки подлинности в службе.

После подключения к службе потребуется выбрать подписку Azure, в которой вы хотите создать новый масштабируемый набор. Если в вашей учетной записи Azure имеется только одна подписка, можете пропустить этот этап; в противном случае используйте Get-AzureRmSubscription и Select-AzureRmSubscription.

Обычно я рекомендую создать новую группу ресурсов Azure для тестирования объектов, чтобы упростить очистку результатов тестирования, не загрязняя производственные группы ресурсов. К счастью, сделать это в Azure несложно; создайте новую группу ресурсов с использованием New-AzureRmResourceGroup. При этом необходимо указать имя и регион Azure, где вы хотите разместить ресурсы, как показано на экране 3.

 

Создание новой группы ресурсов
Экран 3. Создание новой группы ресурсов

Определив подписку и группу ресурсов, следует воспользоваться командой New-AzureRmResourceGroupDeployment для создания масштабируемого набора. У этой команды действительно большой набор параметров, но единственное, что необходимо указать, — это группа ресурсов, в которой вы хотите создать масштабируемый набор, и файл шаблона, который предстоит использовать. Расположение файла шаблона можно указать через универсальный код ресурса (URI) (удобно, если файл находится в службе хранилища Azure или на веб-узле). Параметры, необходимые файлу шаблона (если они вообще требуются), могут быть указаны в файле (с использованием параметров -TemplateParameterFile или -TemplateParameterUri) или просто через командную строку. PowerShell запросит значения параметров, которые вы пропустили, или если не указан файл параметров шаблона. Например, на экране 4 показано, что вы увидите при выполнении New-AzureRmResourceGroupDeployment с некоторыми, но не всеми параметрами шаблона в командной строке. Обратите внимание, что я получил запрос о значениях для параметров adminPassword и jumpAdminPassword.

 

Запуск команды New-AzureRmResourceGroupDeployment
Экран 4. Запуск команды New-AzureRmResourceGroupDeployment 

В процессе обработки шаблона Azure выдает диагностические сообщения. Если возникает ошибка, вы увидите на консоли знакомый красный текст, с помощью которого команды PowerShell сообщают о неполадках. Например, если ввести недостаточно длинную строку для любого из параметров пароля, то появится сообщение об ошибке, подобное показанному на экране 5.

 

Сообщение об ошибке
Экран 5. Сообщение об ошибке

Иногда проблема оказывается более сложной, особенно когда вы начинаете строить собственные шаблоны. Ошибки возникают довольно часто, и специалисты Microsoft подготовили руководство по диагностике для Azure Resource Manager, опубликованное по адресу: http://aka.ms/arm-debug. В руководстве приведены практические советы по устранению неполадок при развертывании ARM, независимо от того, делается это через портал, PowerShell или командную строку, вручную или с помощью шаблонов. Самые распространенные ошибки — простые опечатки в файле шаблона (в этом случае очень полезен редактор с распознаванием синтаксиса JSON) и использование неверного имени параметра или переменной (например, параметр определен с именем adminusername, а впоследствии к нему обращаются как к adminuser). В сущности, если вам приходилось составлять сценарии или код в других программных языках, вы уже знакомы с типами самых распространенных ошибок. Реже возникают ошибки, связанные с ограничениями службы, такие как попытка создать ресурс, который невозможно использовать в выбранном регионе, или совершить действие, блокируемое политикой ARM, активной для группы ресурсов. Большинство ошибок понятны без дополнительных пояснений и легко устраняются с помощью руководства по диагностике.

Добавление настроек

Только что созданный базовый масштабируемый набор представляет собой группу виртуальных машин Windows без программного обеспечения или приложений помимо базовой операционной системы. Этот вариант не представляет особого интереса. Как отмечалось выше, имеется несколько вариантов настройки рабочих виртуальных машин масштабируемого набора. Самый простой способ начать — воспользоваться настраиваемым сценарием PowerShell. ARM поддерживает этот вариант через конструкцию extensionProfile в файле шаблона; указав, что вы хотите запустить CustomScriptExtension, вы можете загрузить и выполнить выбранный сценарий. Документация по CustomScriptExtension опубликована по адресу: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/extensions-customscript, но вам необходимо еще учитывать следующее.

  • Расширение загрузит ваш сценарий из указанного общедоступного URI.
  • Данный URI может, хотя и не должен, указывать на контейнер хранилища BLOB-объектов Azure. Если используется учетная запись хранилища Azure, то вы можете указать имя учетной записи хранилища и ключ в расширении.
  • Вы можете указать, как выполнить сценарий с параметром commandToExecute. Пример определения CustomScriptExtension приведен в листинге.

В данном случае расширение извлекает сценарий config.ps1 по указанному адресу fileUris, затем выполняет его с помощью PowerShell. В документации Microsoft приведена ссылка на пример сценария по адресу: https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1, который иллюстрирует некоторые практические задачи настройки, в том числе назначения правил брандмауэра, установки компонентов Windows, извлечения и установки пакета приложения. Одно из главных достоинств этого подхода — возможность подготовить и отладить сценарий на обычном компьютере, настраивая его до тех пор, пока он не будет функционировать в точном соответствии с вашими желаниями, а затем развернуть его с помощью CustomScriptExtension. Это процесс знаком всем, кто уже использовал PowerShell DSC или другие методы автоматизации.

Когда выполняется расширение, загруженные файлы сохраняются в динамически созданном каталоге, который является рабочим для commandToExecute. Проще просто воспользоваться этим ярлыком для доступа к вашим файлам, нежели задавать пути прямо в сценариях настройки. Результаты записываются в журнал на каждой машине в каталоге C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension. Это очень ценная информация для поиска неисправностей, поскольку она содержит подробности о происходящем при выполнении расширения.

Тестирование нового масштабируемого набора

Для работы с масштабируемым набором вам потребуется некоторая информация, которую проще всего получить из портала по адресу: https://portal.azure.com. Выполните регистрацию на портале со своей учетной записью и выберите Virtual machine scale sets («Масштабируемые наборы виртуальных машин») на левой панели навигации. Возможно, вам придется использовать команду More services («Дополнительные службы»), чтобы увидеть масштабируемые наборы. Сразу после завершения операции создания Azure запускает виртуальные машины в масштабируемом наборе, и вы немедленно получаете доступ к ним. Пример шаблона, представленный в этой статье, содержит защищенный административный компьютер, который можно использовать для доступа по протоколу удаленного рабочего стола из Интернета к виртуальным машинам в масштабируемом наборе. В зависимости от приложения вам могут потребоваться виртуальные машины, доступные извне, поэтому механизм, используемый для тестирования, может быть простым и всего лишь проверять, выполняется ли приложение, загрузив URL-адрес через подсистему балансировки нагрузки, или сложным, тогда он подключается с учетной записью каждого участника масштабируемого набора и выполняет тестовые процедуры.

Итак, масштабируемые наборы на основе шаблонов — гибкий, легко настраиваемый способ быстрого формирования больших групп виртуальных машин, которые можно настроить для запуска приложений в любое время. Самое важное ограничение заключается в том, что машины необходимо запускать в идентичном состоянии (если только вы не хотите вручную настраивать каждую из них), зато, приложив небольшие усилия, можно построить надежный и мощный масштабируемый набор для любых целей. Это прекрасный пример того, как благодаря масштабируемым «облачным» вычислениям мы получаем возможности, которых просто не существовало раньше.

Листинг. Пример определения CustomScriptExtension 
"extensionProfile": {
"extensions": [
{
"name": "customScript",
"properties": {
"publisher": "Microsoft.Compute",
"settings": {
"fileUris": [
"https://contoso.blob.core.windows.net/config.ps1"
]
},
"typeHandlerVersion": "1.8",
"autoUpgradeMinorVersion": true,
"protectedSettings": {
"commandToExecute": "powershell -ExecutionPolicy Unrestricted- File config.ps1"
},
"type": "CustomScriptExtension"
}
}
]
}