Как объединить несколько операторов в определении политики Azure? - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу создать собственную Azure политику JSON, которая считывает ресурсы Azure и следит за тем, чтобы она соответствовала нашему стандартному соглашению об именах. Например, я пытаюсь настроить его для виртуальных машин, облачных служб и кэша Redis.

{
"if": {
    "allof": [
        {
            "field": "type",
            "equals": "Microsoft.Compute/virtualMachines"
        },
        {
            "not": {
                "anyOf": [
                    {
                        "field": "name",
                        "match": "gz?????????#?##"
                    }
                ]
            }
        }
    ]
},
"then": {
    "effect": "[parameters('effect')]"
}

"if": {
    "allof": [
        {
            "field": "type",
            "equals": "Microsoft.ClassicCompute/domainNames"
        },
        {
            "not": {
                "anyOf": [
                    {
                        "field": "name",
                        "match": "GZ?-??????-??#-???-??????-###"
                    }
                ]
            }
        }
    ]
},
"then": {
    "effect": "[parameters('effect')]"
}

"if": {
    "allof": [
        {
            "field": "type",
            "equals": "Microsoft.Cache/Redis"
        },
        {
            "not": {
                "anyOf": [
                    {
                        "field": "name",
                        "match": "gz?????????#???###"
                    }
                ]
            }
        }
    ]
},
"then": {
    "effect": "[parameters('effect')]"
}

}

Не думаю, что Azure позволяет Несколько IF, например, как я пытаюсь настроить его. Я хочу, чтобы это было так:

Если ресурс является виртуальной машиной и не соответствует этому соглашению, то выполните аудит. Если ресурс представляет собой облачную службу и не соответствует этому соглашению, выполните аудит. Если ресурсом является Redis-кеш и он не соответствует этому соглашению, то аудит.

1 Ответ

0 голосов
/ 17 апреля 2020

Вы должны использовать инициативу (определение набора политик) для организации нескольких связанных политик, подобных этой. Это будет легче поддерживать, чем одно определение политики с условиями для каждого типа ресурса, и позволит вам увидеть результаты соответствия как для всего набора правил соглашения об именах, так и для каждой отдельной политики.

Например:

  "properties": {
    "displayName": "Naming conventions",
    "policyType": "Custom",
    "parameters": {
      "effect": {
        "type": "String",
        "defaultValue": "Audit"
      }
    },
    "policyDefinitions": [
      {
        "policyDefinitionId": "/subscriptions/<SUBSCRIPTION ID>/providers/Microsoft.Authorization/policyDefinitions/<YOUR VIRTUAL MACHINE NAMING CONVENTION POLICY ID>",
        "parameters": {
          "effect": {
            "value": "[parameters('effect')]"
          }
        }
      },
      {
        "policyDefinitionId": "/subscriptions/<SUBSCRIPTION ID>/providers/Microsoft.Authorization/policyDefinitions/<YOUR DOMAIN NAME NAMING CONVENTION POLICY ID>",
        "parameters": {
          "effect": {
            "value": "[parameters('effect')]"
          }
        }
      }
    ]
  }
}

Я бы не советовал, но если вам нужно объединить несколько типов в одном определении, вы можете использовать anyOf, например:

{
  "if": {
    "anyOf": [
      {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.Compute/virtualMachines"
          },
          {
            "not": {
                "field": "name",
                "match": "gz?????????#?##"
            }
          }
        ]
      },
      {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.ClassicCompute/domainNames"
          },
          {
            "not": {
              "field": "name",
              "match": "GZ?-??????-??#-???-??????-###"
            }
          }
        ]
      }
    ]
  },
  "then" : {
    "effect" : "audit"
  }
}
...