Azure Policy 定义结构参数

参数可减少策略定义的数量,有助于简化策略管理。 使用类似窗体中字段的参数:nameaddresscitystate。 这些参数始终保持不变,但其值会基于窗体中的各填写内容变化。 构建策略时,参数同样适用。 如果在策略定义中包括参数,就可以通过使用不同的值重新使用策略以执行不同方案。

添加或删除参数

参数可以添加到现有和已分配的定义。 新参数必须包含 defaultValue 属性。 此属性可以防止策略或计划的现有分配间接被设为无效。

无法从策略定义中移除参数,因为可能存在设置参数值的赋值,并且该引用将被破坏。 一些内置策略已使用 "deprecated": true 元数据弃用了参数,在 Azure 门户中分配定义时,这会隐藏参数。 虽然自定义策略定义不支持此方法,但另一种选择是复制并新建不带参数自定义策略定义。

参数属性

参数在策略定义中使用以下属性:

  • name:参数的名称。 由策略规则中的 parameters 部署函数使用。 有关详细信息,请参阅使用参数值
  • type:确定参数是 stringarrayobjectbooleanintegerfloat 还是 dateTime
  • metadata:定义主要由 Azure 门户用来显示用户友好信息的子属性:
    • description:说明参数的用途。 可以用来提供可接受值的示例。
    • displayName:在门户中显示的用于参数的友好名称。
    • strongType:(可选)通过门户分配策略定义时使用。 提供上下文感知列表。 有关详细信息,请参阅 strongType
    • assignPermissions:(可选)设置为“true”,使 Azure 门户在策略分配过程中创建角色分配。 如果希望在分配范围之外分配权限,此属性会很有用。 策略中每个角色定义(或所有计划的策略中的每个角色定义)都有一个角色分配。 参数值必须是有效的资源或范围。
    • deprecated:一个布尔标志,指示参数是否已在内置定义中被弃用。
  • defaultValue:(可选)设置分配的参数的值(如果值未给定)。 在更新已分配的现有策略定义时必须使用此项。 对于 oject 类型的参数,值必须与适当的架构匹配。
  • allowedValues:(可选)提供参数在分配过程中所接受值的数组。
    • 区分大小写:分配策略时允许的值比较区分大小写,这意味着赋值中的所选参数值必须与定义中 allowedValues 数组中的值的大小写相符。 但是,为赋值选择值后,根据使用的条件,对字符串比较的计算可能会不区分大小写。 例如,如果参数将 Dev 指定为赋值中的允许的标记值,并且此值使用 equals 条件与输入字符串进行比较,则 Azure Policy 稍后会将标记值 dev 作为匹配项来计算,即使它小写也是如此,因为 notEquals 不区分大小写。
    • 对于对象类型的参数,值必须与适当的架构匹配。
  • schema:(可选)在分配过程中使用自定义 JSON 架构验证参数输入。 此属性仅支持对象类型的参数,并遵循 Json.NET 架构 2019-09 实现。 可以了解更多关于在 https://json-schema.org/ 使用架构和在 https://www.jsonschemavalidator.net/ 测试草稿架构的信息。

示例参数

示例 1

例如,可以定义策略定义来限制资源的部署位置。 该策略定义的参数可以是 allowedLocations,并且策略定义的每次分配限制接受的值时,会使用此参数。 使用 strongType 可以在通过门户完成分配时提供增强的体验:

"parameters": {
  "allowedLocations": {
    "type": "array",
    "metadata": {
      "description": "The list of allowed locations for resources.",
      "displayName": "Allowed locations",
      "strongType": "location"
    },
    "defaultValue": [
      "chinanorth2"
    ],
    "allowedValues": [
      "chinaeast",
      "chinanorth",
      "chinanorth2"
    ]
  }
}

在分配时,此数组类型参数(没有 strongType)的示例输入可能是 ["chinaeast2", "chinanorth"]

示例 2

在更高级的方案中,可以定义要求 Kubernetes 群集 Pod 使用指定标签的策略。 该策略定义的参数可以是 labelSelector,并且策略定义的每次分配根据标签键和值指定有问题的 Kubernetes 资源时,会使用此参数:

"parameters": {
  "labelSelector": {
    "type": "Object",
    "metadata": {
      "displayName": "Kubernetes label selector",
      "description": "Label query to select Kubernetes resources for policy evaluation. An empty label selector matches all Kubernetes resources."
    },
    "defaultValue": {},
    "schema": {
      "description": "A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all resources.",
      "type": "object",
      "properties": {
        "matchLabels": {
          "description": "matchLabels is a map of {key,value} pairs.",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "minProperties": 1
        },
        "matchExpressions": {
          "description": "matchExpressions is a list of values, a key, and an operator.",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "key": {
                "description": "key is the label key that the selector applies to.",
                "type": "string"
              },
              "operator": {
                "description": "operator represents a key's relationship to a set of values.",
                "type": "string",
                "enum": [
                  "In",
                  "NotIn",
                  "Exists",
                  "DoesNotExist"
                ]
              },
              "values": {
                "description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty.",
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "key",
              "operator"
            ],
            "additionalProperties": false
          },
          "minItems": 1
        }
      },
      "additionalProperties": false
    }
  },
}

分配时此对象类型参数的示例输入采用 JSON 格式,由指定的架构验证,可能是:

{
  "matchLabels": {
    "poolID": "abc123",
    "nodeGroup": "Group1",
    "region": "chinaeast2"
  },
  "matchExpressions": [
    {
      "key": "name",
      "operator": "In",
      "values": [
        "payroll",
        "web"
      ]
    },
    {
      "key": "environment",
      "operator": "NotIn",
      "values": [
        "dev"
      ]
    }
  ]
}

使用参数值

在策略规则中,你可以使用下列 parameters 函数语法引用参数:

{
  "field": "location",
  "in": "[parameters('allowedLocations')]"
}

此示例引用 allowedLocations 参数,该参数已在参数属性中演示过。

strongType

metadata 属性中,可以使用 strongType 来提供 Azure 门户中的一个包含选项的多选列表。 strongType 可以是受支持的资源类型,也可以是允许值。 若要确定“资源类型”是否对 strongType 有效,请使用 Get-AzResourceProvider。 资源类型 strongType 的格式为 <Resource Provider>/<Resource Type> 例如 Microsoft.Network/virtualNetworks/subnets

支持部分不是由 Get-AzResourceProvider 返回的资源类型。 这些类型包括:

  • Microsoft.RecoveryServices/vaults/backupPolicies

strongType 的非资源类型允许值包括:

  • location
  • resourceTypes
  • storageSkus
  • vmSKUs
  • existingResourceGroups

后续步骤