Функции шаблонов ARM в областях развертывания
С помощью шаблонов Azure Resource Manager (ARM) можно выполнять развертывание в группах ресурсов, подписках, группах управления или клиентах. Как правило, функции шаблонов ARM работают одинаково для всех областей. Эта статья описывает различия, которые существуют для некоторых функций в зависимости от области.
Поддерживаемые функции
При развертывании в разных областях необходимо учитывать следующие аспекты:
Функция resourceGroup()поддерживается для развертываний в группах ресурсов.
Функция subscription()поддерживается для развертываний в группах ресурсов и подписках.
Функции reference() и list()поддерживаются для всех областей.
Используйте resourceId(), чтобы получить идентификатор для ресурса, развернутого в группе ресурсов.
"subnet": { "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]" }
Используйте функцию subscriptionResourceId(), чтобы получить идентификатор для ресурса, развернутого в подписке.
Например, чтобы получить идентификатор ресурса для определения политики, развернутого в подписке, используйте следующее:
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
Используйте функцию extensionResourceId() для ресурсов, реализованных в виде расширений группы управления. Определения настраиваемой политики, развернутые в группе управления, являются расширениями группы управления.
Чтобы получить идентификатор ресурса для определения пользовательской политики на уровне группы управления, используйте следующее:
"policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Используйте функцию tenantResourceId(), чтобы получить идентификатор для ресурса, развернутого в клиенте. Определения встроенных политик — это ресурсы уровня клиента. При назначении встроенной политики на уровне группы управления используйте функцию tenantResourceId.
Чтобы получить идентификатор ресурса для определения встроенной политики, используйте следующее:
"policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Разрешение функций в областях
При развертывании в нескольких областях результат выполнения функций resourceGroup() и subscription() зависит от способа указания шаблона. При указании ссылки на внешний шаблон функции всегда разрешаются в области этого шаблона. Если шаблон вложен в родительский шаблон, свойство expressionEvaluationOptions
позволяет указать, где будут разрешаться функции: в группе ресурсов и подписке родительского шаблона или вложенного шаблона. Задайте для свойства значение inner
, чтобы использовать область вложенного шаблона. Задайте для свойства значение outer
, чтобы использовать область родительского шаблона.
В следующей таблице указано, где будут разрешаться функции: в группе ресурсов и подписке родительского шаблона или вложенного шаблона.
Тип шаблона | Область | Решение |
---|---|---|
вложенный | внешний (по умолчанию) | родительская группа ресурсов |
вложенный | Внутреннее | вложенная группа ресурсов |
связанный | Недоступно | вложенная группа ресурсов |
В следующем примере шаблона представлено следующее:
- вложенный шаблон с областью по умолчанию (внешней);
- вложенный шаблон с внутренней областью;
- связанный шаблон.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "defaultScopeTemplate",
"resourceGroup": "inlineGroup",
"properties": {
"mode": "Incremental",
"parameters": {},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"resourceGroupOutput": {
"type": "string",
"value": "[resourceGroup().name]"
}
}
}
}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "innerScopeTemplate",
"resourceGroup": "inlineGroup",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
},
"mode": "Incremental",
"parameters": {},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"resourceGroupOutput": {
"type": "string",
"value": "[resourceGroup().name]"
}
}
}
}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "linkedTemplate",
"resourceGroup": "linkedGroup",
"properties": {
"mode": "Incremental",
"parameters": {},
"templateLink": {
"contentVersion": "1.0.0.0",
"uri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/resourcegroupname.json"
}
}
}
],
"outputs": {
"parentRG": {
"type": "string",
"value": "[format('Parent resource group is {0}', resourceGroup().name)]"
},
"defaultScopeRG": {
"type": "string",
"value": "[format('Default scope resource group is {0}', reference('defaultScopeTemplate').outputs.resourceGroupOutput.value)]"
},
"innerScopeRG": {
"type": "string",
"value": "[format('Inner scope resource group is {0}', reference('innerScopeTemplate').outputs.resourceGroupOutput.value)]"
},
"linkedRG": {
"type": "string",
"value": "[format('Linked resource group is {0}', reference('linkedTemplate').outputs.resourceGroupOutput.value)]"
}
}
}
Чтобы протестировать предыдущий шаблон и просмотреть результаты, используйте PowerShell или Azure CLI.
New-AzResourceGroup -Name parentGroup -Location southcentralus
New-AzResourceGroup -Name inlineGroup -Location southcentralus
New-AzResourceGroup -Name linkedGroup -Location southcentralus
New-AzResourceGroupDeployment `
-ResourceGroupName parentGroup `
-TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crossresourcegroupproperties.json
Выходные данные из предыдущего примера:
Name Type Value
=============== ========================= ==========
parentRG String Parent resource group is parentGroup
defaultScopeRG String Default scope resource group is parentGroup
innerScopeRG String Inner scope resource group is inlineGroup
linkedRG String Linked resource group is linkedgroup
Дальнейшие действия
- Сведения об определении параметров в шаблоне см. в статье Описание структуры и синтаксиса шаблонов ARM.
- Советы по устранению распространенных ошибок развертывания см. в разделе Устранение распространенных ошибок развертывания в Azure с помощью Azure Resource Manager.
- Сведения о развертывании шаблона, для которого требуется токен SAS, см. в статье Развертывание частного шаблона ARM с помощью токена SAS.