Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: ✔️ Виртуальные машины Windows
В этой статье описываются аспекты шаблона Azure Resource Manager, применяемого к виртуальным машинам. В этой статье не описан полный шаблон для создания виртуальной машины; для этого требуются определения ресурсов для учетных записей хранения, сетевых интерфейсов, общедоступных IP-адресов и виртуальных сетей. Дополнительные сведения о том, как эти ресурсы можно определить вместе, см. в пошаговом руководстве по шаблону Resource Manager.
В коллекции существует множество шаблонов, включающих ресурс виртуальной машины. Здесь описаны не все элементы, которые можно включить в шаблон.
В этом примере показан типичный раздел ресурса шаблона для создания указанного количества виртуальных машин:
"resources": [
{
"apiVersion": "2016-04-30-preview",
"type": "Microsoft.Compute/virtualMachines",
"name": "[concat('myVM', copyindex())]",
"location": "[resourceGroup().location]",
"copy": {
"name": "virtualMachineLoop",
"count": "[parameters('numberOfInstances')]"
},
"dependsOn": [
"[concat('Microsoft.Network/networkInterfaces/myNIC', copyindex())]"
],
"properties": {
"hardwareProfile": {
"vmSize": "Standard_DS1"
},
"osProfile": {
"computername": "[concat('myVM', copyindex())]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]"
},
"storageProfile": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2012-R2-Datacenter",
"version": "latest"
},
"osDisk": {
"name": "[concat('myOSDisk', copyindex())]",
"caching": "ReadWrite",
"createOption": "FromImage"
},
"dataDisks": [
{
"name": "[concat('myDataDisk', copyindex())]",
"diskSizeGB": "100",
"lun": 0,
"createOption": "Empty"
}
]
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces',
concat('myNIC', copyindex()))]"
}
]
},
"diagnosticsProfile": {
"bootDiagnostics": {
"enabled": "true",
"storageUri": "[concat('https://', variables('storageName'), '.blob.core.windows.net')]"
}
}
},
"resources": [
{
"name": "Microsoft.Insights.VMDiagnosticsSettings",
"type": "extensions",
"location": "[resourceGroup().location]",
"apiVersion": "2016-03-30",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
],
"properties": {
"publisher": "Microsoft.Azure.Diagnostics",
"type": "IaaSDiagnostics",
"typeHandlerVersion": "1.5",
"autoUpgradeMinorVersion": true,
"settings": {
"xmlCfg": "[base64(concat(variables('wadcfgxstart'),
variables('wadmetricsresourceid'),
concat('myVM', copyindex()),
variables('wadcfgxend')))]",
"storageAccount": "[variables('storageName')]"
},
"protectedSettings": {
"storageAccountName": "[variables('storageName')]",
"storageAccountKey": "[listkeys(variables('accountid'),
'2015-06-15').key1]",
"storageAccountEndPoint": "https://core.windows.net"
}
}
},
{
"name": "MyCustomScriptExtension",
"type": "extensions",
"apiVersion": "2016-03-30",
"location": "[resourceGroup().location]",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
],
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.7",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"[concat('https://', variables('storageName'),
'.blob.core.windows.net/customscripts/start.ps1')]"
],
"commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File start.ps1"
}
}
}
]
}
]
Примечание.
В этом примере используется учетная запись хранения, созданная ранее. Вы можете создать учетную запись хранения, развернув ее из шаблона. В этом примере также используется сетевой интерфейс и его зависимые ресурсы, которые будут определены в шаблоне. Эти ресурсы не отображаются в примере.
Версия API
При развертывании ресурсов с помощью шаблона необходимо указать версию API для использования. В примере показан ресурс виртуальной машины с помощью этого элемента APIVersion:
"apiVersion": "2016-04-30-preview",
Версия API, указанная в шаблоне, влияет на свойства, которые можно определить в шаблоне. Как правило, при создании шаблонов следует выбрать последнюю версию API. Для существующих шаблонов можно решить, следует ли продолжать использовать более раннюю версию API или обновить шаблон для последней версии, чтобы воспользоваться преимуществами новых функций.
Используйте следующие возможности для получения последних версий API:
- REST API — список всех поставщиков ресурсов
- PowerShell — Get-AzResourceProvider
- Azure CLI — az provider show
Параметры и переменные
Параметры упрощают указание значений шаблона при его запуске. Этот раздел параметров используется в примере:
"parameters": {
"adminUsername": { "type": "string" },
"adminPassword": { "type": "securestring" },
"numberOfInstances": { "type": "int" }
},
При развертывании примера шаблона введите значения для имени и пароля учетной записи администратора на каждой виртуальной машине и количества создаваемых виртуальных машин. Вы можете указать значения параметров в отдельном файле, управляемом шаблоном, или указать значения при появлении запроса.
Переменные упрощают настройку значений в шаблоне, который многократно используется во всем шаблоне или может изменяться с течением времени. Этот раздел переменных используется в примере:
"variables": {
"storageName": "mystore1",
"accountid": "[concat('/subscriptions/', subscription().subscriptionId,
'/resourceGroups/', resourceGroup().name,
'/providers/','Microsoft.Storage/storageAccounts/', variables('storageName'))]",
"wadlogs": "<WadCfg>
<DiagnosticMonitorConfiguration overallQuotaInMB=\"4096\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration\">
<DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter=\"Error\"/>
<WindowsEventLog scheduledTransferPeriod=\"PT1M\" >
<DataSource name=\"Application!*[System[(Level = 1 or Level = 2)]]\" />
<DataSource name=\"Security!*[System[(Level = 1 or Level = 2)]]\" />
<DataSource name=\"System!*[System[(Level = 1 or Level = 2)]]\" />
</WindowsEventLog>",
"wadperfcounters": "<PerformanceCounters scheduledTransferPeriod=\"PT1M\">
<PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Thread Count\" sampleRate=\"PT15S\" unit=\"Count\">
<annotation displayName=\"Threads\" locale=\"en-us\"/>
</PerformanceCounterConfiguration>
</PerformanceCounters>",
"wadcfgxstart": "[concat(variables('wadlogs'), variables('wadperfcounters'),
'<Metrics resourceId=\"')]",
"wadmetricsresourceid": "[concat('/subscriptions/', subscription().subscriptionId,
'/resourceGroups/', resourceGroup().name ,
'/providers/', 'Microsoft.Compute/virtualMachines/')]",
"wadcfgxend": "\"><MetricAggregation scheduledTransferPeriod=\"PT1H\"/>
<MetricAggregation scheduledTransferPeriod=\"PT1M\"/>
</Metrics></DiagnosticMonitorConfiguration>
</WadCfg>"
},
При развертывании примера шаблона значения переменных используются для имени и идентификатора ранее созданной учетной записи хранения. Переменные также используются для предоставления параметров для расширения диагностики. Используйте рекомендации по созданию шаблонов Azure Resource Manager, чтобы помочь вам решить, как структурировать параметры и переменные в шаблоне.
Циклы ресурсов
Если для приложения требуется несколько виртуальных машин, можно использовать элемент копирования в шаблоне. Этот необязательный элемент выполняет цикл создания количества виртуальных машин, указанных в качестве параметра:
"copy": {
"name": "virtualMachineLoop",
"count": "[parameters('numberOfInstances')]"
},
Кроме того, обратите внимание на то, что индекс цикла используется при указании некоторых значений ресурса. Например, если вы ввели число экземпляров из трех, имена дисков операционной системы : myOSDisk1, myOSDisk2 и myOSDisk3:
"osDisk": {
"name": "[concat('myOSDisk', copyindex())]",
"caching": "ReadWrite",
"createOption": "FromImage"
}
Примечание.
В этом примере используются управляемые диски для виртуальных машин.
Помните, что при создании цикла для одного ресурса в шаблоне может потребоваться использовать цикл при создании или доступе к другим ресурсам. Например, несколько виртуальных машин не могут использовать один и тот же сетевой интерфейс, поэтому, если ваш шаблон последовательно создает три виртуальных машины, он также должен последовательно создавать три сетевых интерфейса. При назначении сетевого интерфейса виртуальной машине индекс цикла используется для его идентификации:
"networkInterfaces": [ {
"id": "[resourceId('Microsoft.Network/networkInterfaces',
concat('myNIC', copyindex()))]"
} ]
Зависимости
Большинство ресурсов зависят от других ресурсов для правильной работы. Виртуальные машины должны быть связаны с виртуальной сетью и для этого требуется сетевой интерфейс. Элемент dependsOn используется для того, чтобы убедиться, что сетевой интерфейс готов к использованию перед созданием виртуальных машин:
"dependsOn": [
"[concat('Microsoft.Network/networkInterfaces/', 'myNIC', copyindex())]"
],
Resource Manager развертывает параллельно все ресурсы, которые не зависят от развертываемого другого ресурса. Будьте осторожны при настройке зависимостей, так как вы можете непреднамеренно замедлить развертывание, указав ненужные зависимости. Зависимости могут быть связаны с несколькими ресурсами. Например, сетевой интерфейс зависит от общедоступных IP-адресов и ресурсов виртуальной сети.
Как узнать, требуется ли зависимость? Просмотрите значения, заданные в шаблоне. Если элемент определения ресурсов виртуальной машины указывает на другой ресурс, развернутый в том же шаблоне, требуется зависимость. Например, пример виртуальной машины определяет сетевой профиль:
"networkProfile": {
"networkInterfaces": [ {
"id": "[resourceId('Microsoft.Network/networkInterfaces',
concat('myNIC', copyindex())]"
} ]
},
Чтобы задать это свойство, сетевой интерфейс должен существовать. Поэтому требуется зависимость. Кроме того, необходимо задать зависимость, если один ресурс (дочерний) определен в другом ресурсе (родительском). Например, параметры диагностики и расширения пользовательских скриптов определяются как дочерние ресурсы виртуальной машины. Они не могут быть созданы до тех пор, пока виртуальная машина не существует. Поэтому оба ресурса помечаются как зависящие от виртуальной машины.
Профили
При определении ресурса виртуальной машины используются несколько элементов профиля. Некоторые из них являются обязательными, и некоторые из них являются необязательными. Например, требуются элементы hardwareProfile, osProfile, storageProfile и networkProfile, но diagnosticsProfile является необязательным. Эти профили определяют такие параметры, как:
- размера
- имя и учетные данные
- Параметры диска и операционной системы
- сетевой интерфейс
- Диагностика загрузки
Диски и образы
В Azure vhd-файлы могут представлять диски или образы. Если операционная система в VHD-файле специализирована для конкретной виртуальной машины, она называется диском. Когда операционная система в VHD-файле обобщена для создания множества виртуальных машин, она называется изображением.
Создание виртуальных машин и новых дисков на основе образа платформы
При создании виртуальной машины необходимо решить, какую операционную систему следует использовать. Элемент ImageReference используется для определения операционной системы новой виртуальной машины. В примере показано определение операционной системы Windows Server:
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2012-R2-Datacenter",
"version": "latest"
},
Если вы хотите создать операционную систему Linux, можно использовать это определение:
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "20.04.2-LTS",
"version": "latest"
},
Примечание.
Измените publisher
, sku
offer
и version
значения соответственно.
Параметры конфигурации диска операционной системы назначаются элементом osDisk. В примере определяется новый управляемый диск с режимом кэширования, равным ReadWrite , и что диск создается на основе образа платформы:
"osDisk": {
"name": "[concat('myOSDisk', copyindex())]",
"caching": "ReadWrite",
"createOption": "FromImage"
},
Создание виртуальных машин с существующих управляемых дисков
Если вы хотите создать виртуальные машины с существующих дисков, удалите imageReference и элементы osProfile и определите следующие параметры диска:
"osDisk": {
"osType": "Windows",
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks', [concat('myOSDisk', copyindex())])]"
},
"caching": "ReadWrite",
"createOption": "Attach"
},
Создание виртуальных машин из управляемого образа
Если вы хотите создать виртуальную машину из управляемого образа, измените элемент imageReference и определите следующие параметры диска:
"storageProfile": {
"imageReference": {
"id": "[resourceId('Microsoft.Compute/images', 'myImage')]"
},
"osDisk": {
"name": "[concat('myOSDisk', copyindex())]",
"osType": "Windows",
"caching": "ReadWrite",
"createOption": "FromImage"
}
},
Присоединение дисков данных
При необходимости можно добавить диски данных на виртуальные машины. Количество дисков зависит от размера используемого диска операционной системы. Если для виртуальных машин задано значение Standard_DS1_v2, максимальное количество дисков данных, которые можно добавить к ним, составляет два. В этом примере к каждой виртуальной машине добавляется один управляемый диск данных:
"dataDisks": [
{
"name": "[concat('myDataDisk', copyindex())]",
"diskSizeGB": "100",
"lun": 0,
"caching": "ReadWrite",
"createOption": "Empty"
}
],
Расширения
Хотя расширения являются отдельным ресурсом, они тесно связаны с виртуальными машинами. Расширения можно добавлять как дочерний ресурс виртуальной машины или как отдельный ресурс. В примере показано, как расширение диагностики добавляется к виртуальным машинам:
{
"name": "Microsoft.Insights.VMDiagnosticsSettings",
"type": "extensions",
"location": "[resourceGroup().location]",
"apiVersion": "2016-03-30",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
],
"properties": {
"publisher": "Microsoft.Azure.Diagnostics",
"type": "IaaSDiagnostics",
"typeHandlerVersion": "1.5",
"autoUpgradeMinorVersion": true,
"settings": {
"xmlCfg": "[base64(concat(variables('wadcfgxstart'),
variables('wadmetricsresourceid'),
concat('myVM', copyindex()),
variables('wadcfgxend')))]",
"storageAccount": "[variables('storageName')]"
},
"protectedSettings": {
"storageAccountName": "[variables('storageName')]",
"storageAccountKey": "[listkeys(variables('accountid'),
'2015-06-15').key1]",
"storageAccountEndPoint": "https://core.windows.net"
}
}
},
Этот ресурс расширения использует переменную storageName и диагностические переменные для предоставления значений. Если вы хотите изменить данные, собранные этим расширением, можно добавить дополнительные счетчики производительности в переменную wadperfcounters. Вы также можете поместить данные диагностики в другую учетную запись хранения, отличную от места хранения дисков виртуальной машины.
Существует множество расширений, которые можно установить на виртуальной машине, но наиболее полезным, вероятно, является расширение пользовательского скрипта. В примере скрипт PowerShell с именем start.ps1 выполняется на каждой виртуальной машине при первом запуске:
{
"name": "MyCustomScriptExtension",
"type": "extensions",
"apiVersion": "2016-03-30",
"location": "[resourceGroup().location]",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
],
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.7",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"[concat('https://', variables('storageName'),
'.blob.core.windows.net/customscripts/start.ps1')]"
],
"commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File start.ps1"
}
}
}
Скрипт start.ps1 может выполнять множество задач конфигурации. Например, диски данных, добавляемые к виртуальным машинам в примере, не инициализированы; для инициализации их можно использовать настраиваемый скрипт. При наличии нескольких задач запуска можно использовать файл start.ps1 для вызова других сценариев PowerShell в службе хранилища Azure. В примере используется PowerShell, но вы можете использовать любой метод сценариев, доступный в используемой операционной системе.
Состояние установленных расширений можно просмотреть в настройках расширений на портале.
Вы также можете получить сведения о расширении, используя команду PowerShell Get-AzVMExtension, команду Azure CLI vm extension get или REST API Get extension information.
Развертывания
При развертывании шаблона Azure отслеживает ресурсы, развернутые в качестве группы, и автоматически назначает имя развернутой группе. Имя развертывания совпадает с именем шаблона.
Если вы хотите узнать о состоянии ресурсов в развертывании, просмотрите группу ресурсов на портале Azure:
Это не проблема, чтобы использовать тот же шаблон для создания ресурсов или обновления существующих ресурсов. При использовании команд для развертывания шаблонов у вас есть возможность сказать, какой режим вы хотите использовать. Для режима можно задать значение Complete или Incremental. По умолчанию необходимо выполнять добавочные обновления. Будьте осторожны при использовании режима завершения , так как вы можете случайно удалить ресурсы. При установке режима "Завершить" Resource Manager удаляет все ресурсы в группе ресурсов, не входящих в шаблон.
Дальнейшие шаги
- Создайте собственный шаблон с помощью инструкций по созданию шаблонов Azure Resource Manager.
- Разверните созданный шаблон с помощью создания виртуальной машины Windows с помощью шаблона Resource Manager.
- Узнайте, как управлять созданными вами виртуальными машинами, ознакомившись с Создание и управление виртуальными машинами Windows с помощью модуля Azure PowerShell.
- Синтаксис JSON и свойства типов ресурсов в шаблонах см. в справочнике по шаблону Azure Resource Manager.