Modello di Criteri di Azure: distribuire risorse

L'effetto deployIfNotExists consente di distribuire un modello di Azure Resource Manager quando si crea o si aggiorna una risorsa non conforme. Questo approccio può essere preferibile all'uso dell'effetto deny, perché consente di continuare a creare risorse, ma assicura che vengano apportate modifiche per renderle conformi.

Definizione di criteri di esempio

Questa definizione di criteri usa l'operatore field per valutare l'oggetto type della risorsa creata o aggiornata. Quando tale risorsa è Microsoft.Network/virtualNetworks, il criterio cerca un network watcher nella posizione della risorsa nuova o aggiornata. Se non viene trovato un network watcher corrispondente, viene distribuito il modello di Resource Manager per creare la risorsa mancante.

Nota

Questo criterio richiede che si abbia un gruppo di risorse denominato NetworkWatcherRG nel proprio abbonamento. Azure crea il gruppo di risorse NetworkWatcherRG quando si abilita Network Watcher in un'area.

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

Spiegazione

existenceCondition

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

Il blocco properties.policyRule.then.details indica a Criteri di Azure cosa cercare in relazione alla risorsa creata o aggiornata nel blocco properties.policyRule.if. In questo esempio è necessario che esista un network watcher nel gruppo di risorse networkWatcherRG con field location equivalente alla posizione della risorsa nuova o aggiornata. L'uso della funzione field() consente a existenceCondition di accedere alle proprietà della risorsa nuova o aggiornata, in particolare la proprietà location.

roleDefinitionIds

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

La proprietà della matrice roleDefinitionIds nel blocco properties.policyRule.then.details indica alla definizione di criteri quali diritti sono necessari all'identità gestita per distribuire il modello di Resource Manager incluso. Questa proprietà deve essere impostata in modo da includere i ruoli con le autorizzazioni necessarie per la distribuzione del modello, ma deve basarsi sul concetto del 'principio dei privilegi minimi' e avere solo le operazioni necessarie e nient'altro.

Modello di distribuzione

La parte deployment della definizione di criteri include un blocco properties che definisce i tre componenti principali:

  • mode: questa proprietà imposta la modalità di distribuzione del modello.

  • template: questa proprietà include il modello stesso. In questo esempio, il parametro modello location imposta la posizione della nuova risorsa network watcher.

    "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: questa proprietà definisce i parametri forniti a template. I nomi dei parametri devono corrispondere a quanto definito in template. In questo esempio il parametro è denominato location per la corrispondenza. Il valore di location usa di nuovo la funzione field() per ottenere il valore della risorsa valutata, ovvero la rete virtuale nel blocco policyRule.if.

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

Passaggi successivi