Compartir vía


Efecto de deployIfNotExists en las definiciones de Azure Policy

De forma similar a auditIfNotExists, una deployIfNotExists definición de directiva ejecuta una implementación de plantilla cuando se cumple la condición. Las asignaciones de directivas con efecto establecido como DeployIfNotExists requieren una identidad administrada para realizar la corrección.

Nota:

Las plantillas anidadas son compatibles con deployIfNotExists, pero las plantillas vinculadas no son compatibles actualmente.

Evaluación de DeployIfNotExists

deployIfNotExists se ejecuta después de un retraso configurable cuando un proveedor de recursos controla una suscripción o solicitud de recursos de creación o actualización y devuelve un código de estado correcto. Se produce una implementación de plantilla si no hay ningún recurso relacionado o si los recursos definidos por existenceCondition no se evalúan como true. La duración de la implementación depende de la complejidad de los recursos incluidos en la plantilla.

Durante un ciclo de evaluación, las definiciones de directiva con un efecto DeployIfNotExists que coinciden con los recursos se marcan como no compatibles, pero no se realiza ninguna acción en ese recurso. Los recursos existentes no compatibles se pueden corregir con una tarea de corrección.

Propiedades de DeployIfNotExists

La propiedad details del efecto DeployIfNotExists tiene todas las subpropiedades que definen los recursos relacionados con los que se establece la coincidencia y la implementación de plantilla que se ejecuta.

  • type (obligatorio)
    • Especifica el tipo del recurso relacionado que debe coincidir.
    • Si type es un tipo de recurso debajo del if recurso de condición, la directiva consulta los recursos de este type dentro del ámbito del recurso evaluado. De lo contrario, las consultas de directiva dentro del mismo grupo de recursos o suscripción que el recurso evaluado dependen de existenceScope.
  • name (opcional)
    • Especifica el nombre exacto del recurso que debe coincidir y hace que la directiva capture un recurso específico en lugar de todos los recursos del tipo especificado.
    • Cuando los valores de condición para if.field.type y then.details.type coinciden, name se requiere y debe ser [field('name')], o [field('fullName')] para un recurso secundario.

Nota:

Los segmentos type y name se pueden combinar para recuperar de forma genérica los recursos anidados.

Para recuperar un recurso específico, puede usar "type": "Microsoft.ExampleProvider/exampleParentType/exampleNestedType" y "name": "parentResourceName/nestedResourceName".

Para recuperar una colección de recursos anidados, se puede proporcionar un ? de carácter comodín en lugar del segmento de apellidos. Por ejemplo, "type": "Microsoft.ExampleProvider/exampleParentType/exampleNestedType" y "name": "parentResourceName/?". Esto se puede combinar con funciones de campo para acceder a los recursos relacionados con el recurso evaluado, como "name": "[concat(field('name'), '/?')]"".

  • resourceGroupName (opcional)

    • Permite que la coincidencia del recurso relacionado provenga de un grupo de recursos diferente.
    • No se aplica si type es un recurso que estaría debajo del if recurso de condición.
    • El valor predeterminado es el grupo de recursos del recurso de la condición if.
    • Si se ejecuta una implementación de plantilla, se implementa en el grupo de recursos de este valor.
  • existenceScope (opcional)

    • Los valores permitidos son Subscription y ResourceGroup.
    • Establece el ámbito de donde obtener el recurso relacionado para que coincida.
    • No se aplica si type es un recurso que estaría debajo del if recurso de condición.
    • Para ResourceGroup, limitaría al grupo de recursos en resourceGroupName si se especifica. Si resourceGroupName no se especifica, limitaría al if grupo de recursos del recurso de condición, que es el comportamiento predeterminado.
    • En Suscripción, consulta toda la suscripción para el recurso relacionado. El ámbito de asignación debe establecerse en la suscripción o superior para una evaluación adecuada.
    • El valor predeterminado es ResourceGroup.
  • evaluationDelay (opcional)

    • Especifica cuándo se debe evaluar la existencia de los recursos relacionados. El retraso solo se usa para las evaluaciones que son el resultado de una solicitud de creación o actualización de recursos.
    • Los valores permitidos son AfterProvisioning, AfterProvisioningSuccess, AfterProvisioningFailureo una duración ISO 8601 entre 0 y 360 minutos.
    • Los valores AfterProvisioning inspeccionan el resultado de aprovisionamiento del recurso que se evaluó en la condición if de la regla de directiva. AfterProvisioning se ejecuta una vez completado el aprovisionamiento, independientemente del resultado. Si el aprovisionamiento tarda más de seis horas, se trata como un error a la hora de determinar los retrasos de evaluación de AfterProvisioning.
    • El valor predeterminado es PT10M (10 minutos).
    • Especificar un retraso de evaluación largo podría provocar que el estado de cumplimiento registrado del recurso no se actualice hasta el siguiente desencadenador de evaluación.
  • existenceCondition (opcional)

    • Si no se especifica, cualquier recurso relacionado de type satisface el efecto y no desencadena la implementación.
    • Usa el mismo lenguaje que la regla de directiva para la if condición, pero se evalúa individualmente contra cada recurso relacionado.
    • Si algún recurso relacionado coincidente se evalúa como verdadero, el efecto se considera cumplido y no desencadena la implementación.
    • Puede usar [field()] para comprobar la equivalencia con valores en la if condición.
    • Por ejemplo, podría usarse para validar que el recurso primario (en la if condición) está en la misma ubicación del recurso que el recurso relacionado coincidente.
  • roleDefinitionIds (obligatorio)

  • deploymentScope (opcional)

    • Los valores permitidos son Subscription y ResourceGroup.
    • Establece el tipo de implementación que se va a desencadenar. La suscripción indica una implementación en el nivel de suscripción y ResourceGroup indica una implementación en un grupo de recursos.
    • Se debe especificar una propiedad location en la implementación cuando se usan implementaciones de nivel de suscripción.
    • El valor predeterminado es ResourceGroup.
  • deployment (obligatorio)

    • Esta propiedad debe incluir la implementación de plantilla completa, ya que luego se pasaría a la API PUT Microsoft.Resources/deployments. Para obtener más información, consulte la API REST de Implementaciones.
    • Las implementaciones de Microsoft.Resources/deployments anidadas en la plantilla deben usar nombres únicos para evitar la contención entre varias evaluaciones de directivas. El nombre de la implementación primaria se puede usar como parte del nombre de las implementaciones anidadas mediante [concat('NestedDeploymentName-', uniqueString(deployment().name))].

    Nota:

    Todas las funciones dentro de la deployment propiedad se evalúan como componentes de la plantilla, no como la directiva. La excepción es la parameters propiedad que pasa valores de la directiva a la plantilla. En esta sección, el value se utiliza dentro de un nombre de parámetro de plantilla para realizar este paso de valor (vea fullDbName en el ejemplo DeployIfNotExists).

Ejemplo de DeployIfNotExists

Ejemplo: evalúa las bases de datos de SQL Server para determinar si transparentDataEncryption está habilitada. Si no es así, se ejecuta una implementación para habilitar.

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

Pasos siguientes