Patrón de Azure Policy: operadores lógicos

Una definición de directiva puede contener varias instrucciones condicionales. Es posible que necesite que cada instrucción sea verdadera o que solo necesite que algunas de ellas sean verdaderas. Para satisfacer estas necesidades, el lenguaje tiene operadores lógicos para not, allOf y anyOf. Son opcionales y se pueden anidar para crear escenarios complejos.

Muestra 1: un operador lógico

Esta definición de directiva evalúa las cuentas de Azure Cosmos DB para ver si están configuradas las conmutaciones por error automáticas y varias ubicaciones de escritura. Cuando no lo están, se desencadena el efecto audit y crea una entrada de registro cuando se crea o actualiza el recurso no compatible.

{
  "properties": {
    "mode": "all",
    "displayName": "Audit Automatic Failover for CosmosDB accounts",
    "description": "This policy audits Automatic Failover for CosmosDB accounts",
    "policyRule": {
      "if": {
        "allOf": [{
            "field": "type",
            "equals": "Microsoft.DocumentDB/databaseAccounts"
          },
          {
            "field": "Microsoft.DocumentDB/databaseAccounts/enableAutomaticFailover",
            "equals": "false"
          },
          {
            "field": "Microsoft.DocumentDB/databaseAccounts/enableMultipleWriteLocations",
            "equals": "false"
          }
        ]
      },
      "then": {
        "effect": "audit"
      }
    },
    "parameters": {},
    "metadata": {}
  }
}

Muestra 1: Explicación

"policyRule": {
  "if": {
    "allOf": [{
        "field": "type",
        "equals": "Microsoft.DocumentDB/databaseAccounts"
      },
      {
        "field": "Microsoft.DocumentDB/databaseAccounts/enableAutomaticFailover",
        "equals": "false"
      },
      {
        "field": "Microsoft.DocumentDB/databaseAccounts/enableMultipleWriteLocations",
        "equals": "false"
      }
    ]
  },
  "then": {

El bloque policyRule.if usa un solo operador allOf para asegurarse de que las tres condiciones son verdaderas. Solo cuando todas estas condiciones se evalúan como verdaderas, se desencadena el efecto audit.

Ejemplo 2: varios operadores lógicos

Esta definición de directiva evalúa los recursos según un patrón de nomenclatura. Si un recurso no coincide, es denegado.

{
    "properties": {
        "displayName": "Match multiple name patterns.",
        "description": "Allows one of multiple naming patterns for resources.",
        "mode": "Indexed",
        "policyRule": {
            "if": {
                "allOf": [{
                        "not": {
                            "field": "name",
                            "match": "contoso??????"
                        }
                    },
                    {
                        "not": {
                            "field": "name",
                            "match": "contoso-???-##"
                        }
                    }
                ]
            },
            "then": {
                "effect": "deny"
            }
        }
    }
}

Ejemplo 2: Explicación

"if": {
    "allOf": [{
            "not": {
                "field": "name",
                "match": "contoso??????"
            }
        },
        {
            "not": {
                "field": "name",
                "match": "contoso-???-##"
            }
        }
    ]
},

Este bloque policyRule.if también incluye un único operador allOf, pero cada condición se encapsula con el operador lógico not. El condicional dentro del operador lógico not se evalúa primero y, a continuación, se evalúa el operador not para determinar si la cláusula completa es verdadera o falsa. Si ambos operadores lógicos not se evalúan como verdaderos, se desencadena el efecto de la directiva.

Ejemplo 3: Combinación de operadores lógicos

Esta definición de directiva evalúa las cuentas de Spring en Azure para ver si el seguimiento no está habilitado o no se encuentra en un estado correcto.

{
    "properties": {
        "displayName": "Audit Azure Spring Cloud instances where distributed tracing is not enabled",
        "description": "Distributed tracing tools in Azure Spring Cloud allow debugging and monitoring the complex interconnections between microservices in an application. Distributed tracing tools should be enabled and in a healthy state.",
        "mode": "Indexed",
        "policyRule": {
            "if": {
                "allOf": [{
                        "field": "type",
                        "equals": "Microsoft.AppPlatform/Spring"
                    },
                    {
                        "anyOf": [{
                                "field": "Microsoft.AppPlatform/Spring/trace.enabled",
                                "notEquals": "true"
                            },
                            {
                                "field": "Microsoft.AppPlatform/Spring/trace.state",
                                "notEquals": "Succeeded"
                            }
                        ]
                    }
                ]
            },
            "then": {
                "effect": "audit"
            }
        }
    }
}

Ejemplo 3: Explicación

"policyRule": {
    "if": {
        "allOf": [{
                "field": "type",
                "equals": "Microsoft.AppPlatform/Spring"
            },
            {
                "anyOf": [{
                        "field": "Microsoft.AppPlatform/Spring/trace.enabled",
                        "notEquals": "true"
                    },
                    {
                        "field": "Microsoft.AppPlatform/Spring/trace.state",
                        "notEquals": "Succeeded"
                    }
                ]
            }
        ]
    },
    "then": {
        "effect": "audit"
    }
}

Este bloque policyRule.if incluye los operadores lógicos allOf y anyOf. El operador lógico anyOf se evalúa como True siempre que se cumpla una condición incluida. Dado que type está en el núcleo de allOf, siempre se evalúa como True. Si type y una de las condiciones de anyOf son True, se desencadena el efecto de la directiva.

Pasos siguientes