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 中的網路監看員必須存在,且欄位 location
要等於新資源或已更新資源的位置。 使用 field()
函式可讓 existenceCondition 存取新資源或已更新資源上的屬性,尤其是 location
屬性。
roleDefinitionIds
"roleDefinitionIds": [
"/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
],
properties.policyRule.then.details 區塊中的 roleDefinitionIds「陣列」屬性會告訴原則定義,受控識別需要哪些權限才能部署所包含的 Resource Manager 範本。 此屬性必須設定為將具有範本部署所需權限的角色包含在內,但應使用「最低權限原則」的概念,而且只具有所需的作業,而沒有其他任何項目。
部署範本
原則定義的部署部分具有定義了三個核心元件的屬性區塊:
模式 - 此屬性會設定範本的部署模式。
範本 - 此屬性包含範本本身。 在此範例中,位置範本參數會設定新網路監看員資源的位置。
"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')]" }] },
參數 - 此屬性會定義提供給範本的參數。 參數名稱必須符合範本中所定義的名稱。 在此範例中,參數會命名為位置以便相符。 位置的值會再次使用
field()
函式來取得已評估資源的值,也就是 policyRule.if 區塊中的虛擬網路。"parameters": { "location": { "value": "[field('location')]" } }
下一步
- 檢閱其他模式和內建定義。
- 檢閱 Azure 原則定義結構。
- 檢閱了解原則效果。