Azure Policy-patroon: resources implementeren

Met het effect deployIfNotExists kunt u een ARM-sjabloon (Azure Resource Manager) implementeren wanneer u een resource maakt of bijwerkt die niet compatibel is. U kunt de voorkeur geven aan deze methode, boven het gebruik van het effect weigeren, omdat er nog steeds resources worden gemaakt, maar de wijzigingen in deze resources altijd compatibel zijn.

Voorbeeld van beleidsdefinitie

Deze beleidsdefinitie maakt gebruik van de operator veld om de type van de gemaakte of bijgewerkte resource te evalueren. Als deze resource een Microsoft.Network/virtualNetworks is, zoekt het beleid naar een network watcher op de locatie van de nieuwe of bijgewerkte resource. Als er geen overeenkomende network watcher is gevonden, wordt de ARM-sjabloon geïmplementeerd om de ontbrekende resource te maken.

Notitie

Dit beleid vereist dat u een resourcegroep met de naam NetworkWatcherRG in uw abonnement hebt. Azure maakt de resourcegroep NetworkWatcherRG wanneer u Network Watcher inschakelt in een regio.

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

Uitleg

existenceCondition

"type": "Microsoft.Network/networkWatchers",
"resourceGroupName": "networkWatcherRG",
"existenceCondition": {
    "field": "location",
    "equals": "[field('location')]"
},

Het blok properties.policyRule.then.details geeft aan waar met Azure Policy naar moet worden gezocht, gerelateerd aan de gemaakte of bijgewerkte resource in het blok properties.policyRule.if. In dit voorbeeld moet een netwerk-watcher in de resourcegroep networkWatcherRG bestaan met een veldlocation dat gelijk is aan de locatie van de nieuwe of bijgewerkte resource. Met de functie field() kan existenceCondition toegang krijgen tot eigenschappen van de nieuwe of bijgewerkte resource, met name de eigenschap location.

roleDefinitionIds

"roleDefinitionIds": [
    "/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
],

De matrixeigenschaproleDefinitionIds in het blok properties.policyRule.then.details vertelt de beleidsdefinitie welke rechten de beheerde identiteit nodig heeft om de opgenomen Resource Manager sjabloon te implementeren. Deze eigenschap moet zijn ingesteld om rollen te omvatten die machtigingen hebben die nodig zijn voor de sjabloonimplementatie, maar moet gebruikmaken van het concept ‘principe van minste machtigingen’, en mag alleen de benodigde bewerkingen hebben en niets meer.

Implementatiesjabloon

Het implementatiegedeelte van de beleidsdefinitie heeft een blok eigenschappen waarmee drie kernonderdelen worden gedefinieerd:

  • modus: met deze eigenschap wordt de implementatiemodus van de sjabloon ingesteld.

  • sjabloon: deze eigenschap bevat de sjabloon zelf. In dit voorbeeld wordt met de sjabloonparameter locatie de locatie van de nieuwe network watcher-resource ingesteld.

    "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: deze eigenschap definieert parameters die worden opgegeven voor de sjabloon. De parameternamen moeten overeenkomen met de namen die zijn gedefinieerd voor sjabloon. In dit voorbeeld heet de parameter locatie zodat deze overeenkomt. De waarde van locatie maakt opnieuw gebruik van de functie field() om de waarde van de geëvalueerde resource op te halen, wat het virtuele netwerk in het blok policyRule.if is.

    "parameters": {
        "location": {
            "value": "[field('location')]"
        }
    }
    

Volgende stappen