Развертывание виртуальных машин в Azure с помощью Azure Resource Manager — шаблоны ARM (часть 2)

Опубликовано: 7 Марта, 2023

Шаблоны Azure Resource Manager

Шаблоны Azure Resource Manager поддерживаются только при использовании API управления ресурсами Azure. Шаблоны позволяют определить конфигурацию набора объектов Azure и использовать эту конфигурацию для предоставления новых объектов. Он не требует каких-либо навыков программирования, но требует соблюдения определенного формата шаблона, а именно JSON (обозначение объектов JavaScript).

Шаблоны можно отправить для развертывания одним из трех способов:

  • Azure PowerShell с помощью командлета New-AzureRMResourceGroupDeployment
  • Использование развертывания шаблона портала Azure
  • Использование GitHub

Формат шаблона ARM

Файл JSON шаблона ARM имеет определенный формат для разделов, которые составляют конфигурацию объектов для подготовки. Некоторые разделы позволяют вкладывать параметры конфигурации, определять зависимости между объектами и определять значения как часть определения шаблона. При желании вы можете определить значения в файле параметров, которые заменяют переменные в шаблоне, что делает шаблон многократно используемым.

{

«$schema»: «http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#»,

«Версия содержания»: «»,

«параметры»: { },

«переменные»: { },

"Ресурсы": [ ],

«выходы»: { }

}

В таблице 1 поясняются разделы шаблона, требуется ли раздел, а также информация, содержащаяся в каждом разделе.

Раздел Необходимый Описание
$Схема Да URI файла схемы JSON, который описывает версию языка шаблона.
ContentVersion Да Версия шаблона. Так как шаблоны могут иметь несколько версий, это обеспечивает опорное значение для выбора правильного шаблона.
Ресурсы Да Типы объектов, которые развертываются или обновляются с помощью шаблона в группе ресурсов. Ресурсы могут быть вложенными.
Параметры Нет Входные значения, которые предоставляются при выполнении развертывания и используются во всем шаблоне. Вы должны объявить параметр в этом разделе, чтобы определить его в шаблоне. Вы не можете использовать параметр для создания другого параметра.
Переменные Нет Значения, которые используются в шаблоне для присвоения или построения значений. Параметры могут использоваться для построения переменных. Определение переменной может быть основано на выражении или функции для создания буквального значения переменной.
Выходы Нет Значения, которые возвращаются из развертывания шаблона.

Таблица 1: Разделы шаблона ARM

Хотя параметры и переменные не требуются, они почти всегда будут использоваться в файле шаблона.

Для получения дополнительной информации о шаблонных выражениях, которые можно использовать для создания переменных, вы можете обратиться к этой ссылке.

Для получения дополнительной информации о создании шаблонов ARM и синтаксисе шаблонов вы можете обратиться к этой ссылке.

Определение параметров развертывания шаблона

Подобно развертыванию виртуальной машины с помощью PowerShell, использование шаблона ARM требует от вас определения значений, которые будут использоваться во время развертывания. Значения делятся на две категории: значения, которые изменяются при каждом развертывании, и значения, которые являются постоянными или создаются на основе значений во время развертывания. Для шаблонов ARM значения, которые должны предоставляться для каждого развертывания, являются параметрами шаблона, а значения, которые являются постоянными или могут быть созданы, являются переменными шаблона.

В таблице 2 перечислены значения, определенные в шаблоне ARM, которые также использовались или запрашивались как часть сценария PowerShell, описанного в части I этой статьи. Значения определяются в шаблоне как переменная или передаются как параметр во время развертывания. Таблица 2 определяет имя каждого параметра или переменной, а также значение, присвоенное или переданное во время развертывания.

Имя Тип Ценность
STAName Параметр jscvmstorageaccount
STAType Переменная Стандарт_GRS
Расположение Переменная Запад США
NICName Переменная <vmName>сетевой адаптер
Айпи адрес Параметр 10.0.0.10
pubIPType Переменная Динамический
pubIPName Переменная <vmName>паблисип
vNetName Переменная Виртуальная сеть1
имя подсети Параметр Подсеть1
vmName Параметр ВМ1
vmSize Переменная Стандарт_DS1
pubName Переменная MicrosoftWindowsServer
предложениеНазвание Переменная WindowsServer
skuName Переменная 2012-R2-ЦОД
имя_диска Переменная <vmName> OSDisk
пароль администратора Параметр [электронная почта защищена]
adminUsername Параметр Администратор

Таблица 2: Значения шаблона ARM

Определение ресурсов развертывания шаблона

Шаблон ARM должен определять все объекты, которые он будет предоставлять, или ссылки на существующие объекты, от которых он зависит, как часть процесса предоставления. В части I этой статьи сценарий PowerShell подготовил следующие объекты:

  • Учетная запись хранения
  • Общедоступный IP-адрес
  • Сетевой адаптер
  • Виртуальная машина

Сетевой адаптер виртуальной машины также был подключен к существующей подсети. Следовательно, шаблон также должен создавать эти объекты, а также подсеть.

Создание шаблона JSON ARM

При создании шаблона JSON ARM необходимо включить разделы, определенные в Таблице I. Для этого шаблона разделы Schema и ContentVersion представляют собой однострочные разделы, как показано ниже.

«$schema»: «http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#»,

«Версия контента»: «1.0.0.0»,

Параметры шаблона ARM

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

«параметры»: {

«STAName»: {

«тип»: «строка»,

«метаданные»: {

«Описание»: «Уникальное имя учетной записи хранения, в которой будут размещены диски виртуальной машины. Все должно быть в нижнем регистре».

}

},

«VMName»: {

«тип»: «строка»,

«метаданные»: {

«Описание»: «Имя виртуальной машины».

}

},

«псевдоним»: {

«тип»: «строка»,

«метаданные»: {

«Описание»: «Имя сетевого адаптера».

}

},

«имя подсети»: {

«тип»: «строка»,

«метаданные»: {

«Описание»: «Имя подсети для подключения сетевого адаптера».

}

},

"Айпи адрес": {

«тип»: «строка»,

«метаданные»: {

«Описание»: «Частный IP-адрес сетевой карты».

}

},

«adminUsername»: {

«тип»: «строка»,

«метаданные»: {

«Описание»: «Имя администратора для виртуальной машины».

}

},

"пароль администратора": {

«тип»: «securestring»,

«метаданные»: {

«Описание»: «Пароль для виртуальной машины».

}

}

},

Переменные шаблона ARM

После определения параметров необходимо определить переменные, которые являются постоянными или могут быть созданы из параметров и других переменных. Когда вы указываете переменную, вы включаете имя переменной и постоянное значение или выражение, которое создает значение. Например, переменная diskName создается с помощью функции конкатенации строк путем объединения параметра vmName со строкой OSDisk. Предполагая, что значение vmName равно VM1, значение diskName будет VM1OSDisk, как показано ниже.

«переменные»: {

«местоположение»: «Запад США»,

«pubName»: «MicrosoftWindowsServer»,

«Группа ресурсов»: «Группа ресурсов ВМ»

«имя предложения»: «WindowsServer»,

«имя_диска»: «[concat (параметры ('vmName'), 'OSDisk']»,

«nicName»: «[concat (параметры ('vmName'), 'NIC')]»,

«skuName»: «2012-R2-Центр обработки данных»,

«STAType»: «Стандарт_GRS»,

«pubIPName»: «[concat (параметры ('vmName'),'publicip']”,

«pubIPType»: «Динамический»,

«vmStorageAccountContainerName»: «vhds»,

«vmSize»: «Стандарт_DS1»,

«vNetName»: «Виртуальная сеть1»,

"vnetID": "[resourceId(переменные('ResourceGroup'),'Microsoft.Network/virtualNetworks',variables('vNetName'))]",

«subnetRef»: «[concat (переменные ('vnetID'),'/подсети/', параметры ('subnetName'))]”

},

Ресурсы шаблонов ARM

Раздел ресурсов шаблона ARM определяет все объекты, которые шаблон создает во время развертывания. В разделе ресурсов шаблона вы определяете учетную запись хранения, сетевой интерфейс, общедоступный IP-адрес для сетевого интерфейса и виртуальную машину. Объект виртуальной машины и объект сетевого интерфейса содержат операторы как часть определения ресурса. Они используются для определения порядка во время развертывания ресурсов. Например, поскольку сетевой интерфейс зависит от ресурса общедоступного IP-адреса, ресурс общедоступного IP-адреса должен быть успешно предоставлен до предоставления сетевого интерфейса.

Кроме того, ресурс виртуальной машины зависит от сетевого интерфейса и учетной записи хранения. Там они должны быть успешно подготовлены, прежде чем можно будет подготовить виртуальную машину. Зависимости являются вложенными, поскольку сетевой интерфейс также зависит от общедоступного IP-адреса.

Таким образом, порядок развертывания ресурсов будет таким: общедоступный IP-адрес и учетная запись хранения, поскольку они не имеют зависимостей и могут быть подготовлены параллельно. Как только эти объекты будут предоставлены, будет подготовлен сетевой интерфейс, а затем будет подготовлена виртуальная машина, как показано ниже.

"Ресурсы": [

{

«тип»: «Microsoft.Storage/storageAccounts»,

«имя»: «[параметры ('STAName')]»,

«apiVersion»: «2015-05-01-превью»,

«местоположение»: «[переменные ('местоположение')]»,

"характеристики": {

«accountType»: «[переменные ('STAType')]»

}

},

{

«apiVersion»: «2015-05-01-превью»,

«тип»: «Microsoft.Network/publicIPAddresses»,

«имя»: «[переменные ('publicIPAddressName')]»,

«местоположение»: «[переменные ('местоположение')]»,

"характеристики": {

«publicIPAllocationMethod»: «[переменные ('pubIPType')]»,

«Настройки DNS»: {

«domainNameLabel»: «[параметры ('vmName')]»

}

}

},

{

«apiVersion»: «2015-05-01-превью»,

«тип»: «Microsoft.Network/networkInterfaces»,

«имя»: «[параметры ('nicName')]»,

«местоположение»: «[переменные ('местоположение')]»,

"зависит от": [

«[concat('Microsoft.Network/publicIPAddresses/', переменные('publicIPName'))]”

],

"характеристики": {

«IP-конфигурации»: [

{

«имя»: «ipconfig1»,

"характеристики": {

«privateIPAllocationMethod»: «Статический»,

«частный IP-адрес»: «[параметры ('IP-адрес')]»,

«публичный IP-адрес»: {

«id»: «[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPName'))]”

},

«подсеть»: {

«id»: «[переменные ('subnetRef')]»

}

}

}

]

}

},

{

«apiVersion»: «2015-05-01-превью»,

«тип»: «Microsoft.Compute/virtualMachines»,

«имя»: «[параметры ('vmName')]»,

«местоположение»: «[переменные ('местоположение')]»,

"зависит от": [

"[concat('Microsoft.Storage/storageAccounts/', параметры('STAName'))]",

«[concat('Microsoft.Network/networkInterfaces/', параметры('nicName'))]”

],

"характеристики": {

«Профиль оборудования»: {

«vmSize»: «[переменные ('vmSize')]»

},

«Профиль ОС»: {

«имя компьютера»: «[параметры ('vmName')]»,

«adminUsername»: «[параметры ('adminUsername')]»,

«adminPassword»: «[параметры ('adminPassword')]»

},

«профиль хранилища»: {

«ИзображениеСсылка»: {

«издатель»: «[переменные ('pubName')]»,

«предложение»: «[переменные ('имя предложения')]»,

«sku»: «[параметры ('skuName')]»,

«версия»: «последняя»

},

«ОСДиск»: {

«имя»: «осдиск»,

«VHD»: {

«uri»: «[concat('http://',parameters('STAName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('diskName' ),'.vhd')]”

},

«кеширование»: «ЧтениеЗапись»,

«createOption»: «Из изображения»

}

},

«сетевой профиль»: {

«сетевые интерфейсы»: [

{

«id»: «[resourceId('Microsoft.Network/networkInterfaces',parameters('nicName'))]”

}

]

}

}

}

]

}

Развертывание шаблона

После завершения шаблона ARM вы можете инициировать развертывание группы ресурсов с помощью командлета New-AzureRMResoruceGroupDeploymnet, как показано ниже.

$deployName="Тестовое развертывание"

$RGName="VMResourceGroup"

$locname="Западная часть США"

$templateFile=".azuredeploy.json"

New-AzureRmResourceGroupDeployment -Name $deployName -ResourceGroupName $RGName -TemplateFile $templateFile

Когда начнется развертывание на основе шаблона, вам будет предложено ввести значения параметров, как показано ниже.

PS C: empARMTemplate> New-AzureRmResourceGroupDeployment -Name $deployName -ResourceGroupName $RGName -Templatefile.

AzureDeploy.json

командлет New-AzureRmResourceGroupDeployment в позиции 1 конвейера команд

Укажите значения для следующих параметров:

(Введите !? для справки.)

STAName: jscvmstorageaccount

vmName: jscvm1

имя_подсети: Subnet1

IP-адрес: 10.0.0.10

adminUsername: Администратор

пароль администратора: **********

После успешного завершения развертывания вы увидите выходные данные с состоянием ProvisioningState, равным Succeeded, как показано ниже. Вы можете проверить статус подготовки с помощью PowerShell или через портал Azure.

Имя Развертывания: TestDeployment
 ResourceGroupName: вмресаурцеграуп
 Состояние подготовки: успешно
 Отметка времени: 29.12.2015 17:06:22
 Режим: инкрементный
 Ссылка на шаблон:
 Параметры:
 Имя Тип Значение
 =============== ========================= ==========
 staName Строка jscvmstorageaccount
 vmName Строка jscvm1
 subnetName Строка Subnet1
 Строка iPaddress 10.0.0.10
 adminUsername Строка
 adminPassword SecureString
 Выходы:

Вывод

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