Share via


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')]"
        }
    }
    

下一步