Compartilhar via


Efeito deployIfNotExists das definições do Azure Policy

Semelhante a auditIfNotExists, uma definição de política deployIfNotExists executa uma implantação de modelo quando a condição é atendida. As atribuições de política com efeito definido como DeployIfNotExists exigem uma identidade gerenciada para fazer a correção.

Observação

Os modelos aninhados são compatíveis com deployIfNotExists, mas modelos vinculados atualmente não são compatíveis.

Avaliação de DeployIfNotExists

deployIfNotExists é executado depois de um atraso configurável, quando um Provedor de Recursos trata uma solicitação de criação ou atualização de uma assinatura ou recurso e retornou um código de status de êxito. Uma implantação de modelo ocorre quando não existem recursos relacionados ou se os recursos definidos por existenceCondition não são avaliados como verdadeiros. A duração da implantação depende da complexidade dos recursos incluídos no modelo.

Durante um ciclo de avaliação, as definições de política com um efeito DeployIfNotExists que correspondam a recursos são marcadas como não conformes, mas nenhuma ação é realizada no recurso. Os recursos fora de conformidade existentes podem ser corrigidos com uma tarefa de correção.

Propriedades de DeployIfNotExists

A propriedade details do efeito DeployIfNotExists tem todas as subpropriedades que definem os recursos relacionados a serem correspondidos e a implantação de modelo a ser executada.

  • type (obrigatório)
    • Especifica o tipo do recurso relacionado a ser correspondido.
    • Se type for um tipo de recurso abaixo do recurso da condição if, a política consultará recursos desse type no escopo do recurso avaliado. Caso contrário, a política consultará no mesmo grupo de recursos ou assinatura do recurso avaliado, dependendo do existenceScope.
  • name (opcional)
    • Especifica o nome exato do recurso a ser correspondido e faz com que a política busque um recurso específico em vez de todos os recursos do tipo especificado.
    • Quando os valores da condição para if.field.type e then.details.type corresponderem, name torna-se necessária e deve ser [field('name')], ou [field('fullName')] para um recurso filho.

Observação

Os segmentos type e name podem ser combinados para recuperar genericamente recursos aninhados.

Para recuperar um recurso específico, você pode usar "type": "Microsoft.ExampleProvider/exampleParentType/exampleNestedType" e "name": "parentResourceName/nestedResourceName".

Para recuperar uma coleção de recursos aninhados, um caractere curinga ? pode ser fornecido no lugar do segmento de sobrenome. Por exemplo, "type": "Microsoft.ExampleProvider/exampleParentType/exampleNestedType" e "name": "parentResourceName/?". Isso pode ser combinado com funções de campo para acessar recursos relacionados ao recurso avaliado, como "name": "[concat(field('name'), '/?')]"."

  • resourceGroupName (opcional)

    • Permite que a correspondência do recurso relacionado venha de um grupo de recursos diferente.
    • Não se aplica se type for um recurso que estaria sob o recurso de condição if.
    • O padrão é o grupo de recursos do recurso de condição if.
    • Se uma implantação de modelo é executada, ele é implantado no grupo de recursos desse valor.
  • existenceScope (opcional)

    • Os valores permitidos são Assinatura e ResourceGroup.
    • Define o escopo de onde buscar o recurso relacionado com o qual corresponder.
    • Não se aplica se type for um recurso que estaria sob o recurso de condição if.
    • Para ResourceGroup, limitaria o grupo de recursos em resourceGroupName se especificado. Se resourceGroupName não for especificado, limitará ao grupo de recursos do recurso condição if, que é o comportamento padrão.
    • Para Assinatura, consulta a assinatura inteira para o recurso relacionado. O escopo de atribuição deve ser definido na assinatura ou superior para uma avaliação adequada.
    • O padrão é ResourceGroup.
  • evaluationDelay (opcional)

    • Especifica quando a existência dos recursos relacionados deve ser avaliada. O atraso é usado somente para avaliações que são resultado de uma solicitação de criação ou atualização de recurso.
    • Os valores permitidos são AfterProvisioning, AfterProvisioningSuccess, AfterProvisioningFailure ou uma duração ISO 8601 entre 0 e 360 minutos.
    • Os valores de AfterProvisioning inspecionam o resultado de provisionamento do recurso que foi avaliado na condição if da regra de política. AfterProvisioning é executado após a conclusão do provisionamento, independentemente do resultado. O provisionamento que leva mais de seis horas é tratado como uma falha ao determinar atrasos na avaliação do AfterProvisioning.
    • O padrão é PT10M (10 minutos).
    • A especificação de um atraso de avaliação longo pode fazer com que o estado de conformidade registrado do recurso não seja atualizado até o próximo gatilho de avaliação.
  • existenceCondition (opcional)

    • Se não for especificado, todos os recursos relacionados de type cumprem o efeito e não acionam a implantação.
    • Usa a mesma linguagem como a regra de política para a condição if, mas é avaliada em relação a cada recurso relacionado individualmente.
    • Se algum recurso relacionado correspondente for avaliado como verdadeiro, o efeito será atendido e não acionará a implantação.
    • Pode usar [field()] para verificar a equivalência com valores na condição if.
    • Por exemplo, pode ser usado para validar que o recurso pai (na condição if) está no mesmo local que recursos como o recurso relacionado correspondente.
  • roleDefinitionIds (obrigatório)

  • deploymentScope (opcional)

    • Os valores permitidos são Assinatura e ResourceGroup.
    • Define o tipo de implantação a ser disparada. Subscription indica uma implantação no nível de assinatura, ResourceGroup indica uma implantação em um grupo de recursos.
    • Uma propriedade localização deverá ser especificada na Implantação quando usar implantações no nível de assinatura.
    • O padrão é ResourceGroup.
  • deployment (obrigatório)

    • Essa propriedade deve incluir a implantação de modelo completo que seria passada para o API PUT de Microsoft.Resources/deployments. Para obter mais informações, consulte a API REST de implantações.
    • Microsoft.Resources/deployments aninhado dentro do modelo deve usar nomes exclusivos para evitar a contenção entre várias avaliações de política. O nome da implantação pai pode ser usado como parte do nome da implantação aninhada por meio de [concat('NestedDeploymentName-', uniqueString(deployment().name))].

    Observação

    Todas as funções dentro da propriedade deployment são avaliadas como componentes do modelo, não da política. A exceção é a propriedade parameters, que passa os valores da política para o modelo. O value nesta seção em um nome de parâmetro de modelo é usado para executar essa passagem de valor (consulte fullDbName no exemplo do efeito DeployIfNotExists).

Exemplo de DeployIfNotExists

Exemplo: avalia os bancos de dados do SQL Server para determinar se transparentDataEncryption está habilitado. Se não estiver, uma implantação será executada para habilitá-lo.

"if": {
  "field": "type",
  "equals": "Microsoft.Sql/servers/databases"
},
"then": {
  "effect": "deployIfNotExists",
  "details": {
    "type": "Microsoft.Sql/servers/databases/transparentDataEncryption",
    "name": "current",
    "evaluationDelay": "AfterProvisioning",
    "roleDefinitionIds": [
      "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/{roleGUID}",
      "/providers/Microsoft.Authorization/roleDefinitions/{builtinroleGUID}"
    ],
    "existenceCondition": {
      "field": "Microsoft.Sql/transparentDataEncryption.status",
      "equals": "Enabled"
    },
    "deployment": {
      "properties": {
        "mode": "incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
            "fullDbName": {
              "type": "string"
            }
          },
          "resources": [
            {
              "name": "[concat(parameters('fullDbName'), '/current')]",
              "type": "Microsoft.Sql/servers/databases/transparentDataEncryption",
              "apiVersion": "2014-04-01",
              "properties": {
                "status": "Enabled"
              }
            }
          ]
        },
        "parameters": {
          "fullDbName": {
            "value": "[field('fullName')]"
          }
        }
      }
    }
  }
}

Próximas etapas