Padrão de política do Azure: implantar recursos

O efeito deployIfNotExists torna possível implantar um modelo do Azure Resource Manager (modelo ARM) ao criar ou atualizar um recurso que não é compatível. Essa abordagem pode ser preferível ao uso do efeito negar , pois permite que os recursos continuem a ser criados, mas garante que as alterações sejam feitas para torná-los compatíveis.

Exemplo de definição de política

Esta definição de política usa o operador de campo para avaliar o type recurso criado ou atualizado. Quando esse recurso é um Microsoft.Network/virtualNetworks, a política procura um observador de rede no local do recurso novo ou atualizado. Se um observador de rede correspondente não for localizado, o modelo ARM será implantado para criar o recurso ausente.

Nota

Esta política requer que você tenha um grupo de recursos chamado NetworkWatcherRG em sua assinatura. O Azure cria o grupo de recursos NetworkWatcherRG quando você habilita o Inspetor de Rede em uma região.

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

Explicação

existênciaCondição

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

O bloco properties.policyRule.then.details informa ao Azure Policy o que procurar relacionado ao recurso criado ou atualizado no bloco properties.policyRule.if . Neste exemplo, um inspetor de rede no grupo de recursos networkWatcherRG deve existir com campo location igual ao local do recurso novo ou atualizado. O uso da field() função permite que existenceCondition acesse propriedades no recurso novo ou atualizado, especificamente a location propriedade.

roleDefinitionIds

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

A propriedade da matriz roleDefinitionIds no bloco properties.policyRule.then.details informa à definição de política quais direitos a identidade gerenciada precisa para implantar o modelo do Gerenciador de Recursos incluído. Essa propriedade deve ser definida para incluir funções que tenham as permissões necessárias para a implantação do modelo, mas devem usar o conceito de 'princípio de menor privilégio' e ter apenas as operações necessárias e nada mais.

Modelo de implementação

A parte de implantação da definição de política tem um bloco de propriedades que define os três componentes principais:

  • mode - Esta propriedade define o modo de implantação do modelo.

  • template - Esta propriedade inclui o próprio modelo. Neste exemplo, o parâmetro location template define o local do novo recurso do inspetor de rede.

    "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 - Esta propriedade define parâmetros que são fornecidos ao modelo. Os nomes dos parâmetros devem corresponder ao que estão definidos no modelo. Neste exemplo, o parâmetro é nomeado local para corresponder. O valor de location usa a field() função novamente para obter o valor do recurso avaliado, que é a rede virtual no bloco policyRule.if .

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

Próximos passos