Шаблон Политики Azure для развертывания ресурсов
Действие deployIfNotExists позволяет развертывать шаблон Azure Resource Manager (шаблон ARM) при создании или обновлении ресурса, не соответствующего требованиям. Такой подход можно применять вместо действия deny (запрет), так как он позволяет создавать ресурсы, гарантированно приводя их в соответствие требованиям.
Пример определения политики
В этом определении политики используется оператор field для вычисления type
созданного или обновленного ресурса. Если это ресурс с типом Microsoft.Network/virtualNetworks, политика ищет наблюдатель за сетями в том же расположении, где находится новый или обновленный ресурс. Если соответствующий наблюдатель за сетями найти не удается, развертывается шаблон ARM для создания недостающего ресурса.
Примечание.
Для этой политики в подписке должна быть группа ресурсов под именем NetworkWatcherRG. Azure создает группу ресурсов NetworkWatcherRG при включении Наблюдателя за сетями в регионе.
{
"properties": {
"displayName": "Deploy network watcher when virtual networks are created",
"mode": "Indexed",
"description": "This policy creates a network watcher resource in regions with virtual networks. You need to ensure existence of a resource group named networkWatcherRG, which will be used to deploy network watcher instances.",
"metadata": {
"category": "Network"
},
"parameters": {},
"policyRule": {
"if": {
"field": "type",
"equals": "Microsoft.Network/virtualNetworks"
},
"then": {
"effect": "DeployIfNotExists",
"details": {
"type": "Microsoft.Network/networkWatchers",
"resourceGroupName": "networkWatcherRG",
"existenceCondition": {
"field": "location",
"equals": "[field('location')]"
},
"roleDefinitionIds": [
"/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
],
"deployment": {
"properties": {
"mode": "incremental",
"template": {
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string"
}
},
"resources": [{
"apiVersion": "2016-09-01",
"type": "Microsoft.Network/networkWatchers",
"name": "[concat('networkWacher_', parameters('location'))]",
"location": "[parameters('location')]"
}]
},
"parameters": {
"location": {
"value": "[field('location')]"
}
}
}
}
}
}
}
}
}
Описание
existenceCondition
"type": "Microsoft.Network/networkWatchers",
"resourceGroupName": "networkWatcherRG",
"existenceCondition": {
"field": "location",
"equals": "[field('location')]"
},
В блоке properties.policyRule.then.details сообщается Политике Azure, что нужно искать для ресурса, созданного или обновленного в блоке properties.policyRule.if. В нашем примере в группе ресурсов networkWatcherRG должен существовать наблюдатель,у которого значение field location
совпадает с расположением нового или обновленного ресурса. Использование функции field()
позволяет existenceCondition обращаться к свойствам нового или обновленного ресурса, в частности к свойству location
.
roleDefinitionIds
"roleDefinitionIds": [
"/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
],
Свойство array roleDefinitionIds в блоке properties.policyRule.then.details сообщает определению политики, какие права должно иметь управляемое удостоверение для развертывания включенного шаблона Resource Manager. Это свойство должно включать роли с разрешениями, необходимыми для развертывания шаблона, но в соответствии с принципом "наименьших привилегий" не должно включать ничего, кроме обязательных операций.
Шаблон развертывания
Раздел deployment в определении политики содержит блок properties, в котором определены три ключевых компонента.
Свойство mode позволяет задать режим развертывания шаблона.
Свойство template содержит сам шаблон. В нашем примере параметр шаблона location позволяет задать расположение нового ресурса наблюдателя за сетями.
"template": { "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json", "contentVersion": "1.0.0.0", "parameters": { "location": { "type": "string" } }, "resources": [{ "apiVersion": "2016-09-01", "type": "Microsoft.Network/networkWatchers", "name": "[concat('networkWacher_', parameters('location'))]", "location": "[parameters('location')]" }] },
Свойство parameters определяет параметры, предоставленные в template. Имена параметров должны совпадать с теми, которые определены в template. В нашем примере подразумевается, что параметр имеет такое же имя location. Значение location повторно применяет функцию
field()
для получения значения оцениваемого ресурса, который здесь является виртуальной сетью из блока policyRule.if."parameters": { "location": { "value": "[field('location')]" } }
Следующие шаги
- Ознакомьтесь с другими шаблонами и встроенными определениями.
- Изучите статью о структуре определения Политики Azure.
- Изучите сведения о действии политик.