Azure Policy 定义结构参数
参数可减少策略定义的数量,有助于简化策略管理。 使用类似窗体中字段的参数:name
、address
、city
、state
。 这些参数始终保持不变,但其值会基于窗体中的各填写内容变化。 构建策略时,参数同样适用。 如果在策略定义中包括参数,就可以通过使用不同的值重新使用策略以执行不同方案。
添加或删除参数
参数可以添加到现有和已分配的定义。 新参数必须包含 defaultValue
属性。 此属性可以防止策略或计划的现有分配间接被设为无效。
无法从策略定义中移除参数,因为可能存在设置参数值的赋值,并且该引用将被破坏。 一些内置策略已使用 "deprecated": true
元数据弃用了参数,在 Azure 门户中分配定义时,这会隐藏参数。 虽然自定义策略定义不支持此方法,但另一种选择是复制并新建不带参数自定义策略定义。
参数属性
参数在策略定义中使用以下属性:
name
:参数的名称。 由策略规则中的parameters
部署函数使用。 有关详细信息,请参阅使用参数值。type
:确定参数是string
、array
、object
、boolean
、integer
、float
还是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
后续步骤
- 有关策略定义结构的详细信息,请参阅基础知识、策略规则和别名。
- 有关计划,请参阅计划定义结构。
- 在 Azure Policy 示例中查看示例。
- 查看了解策略效果。
- 了解如何以编程方式创建策略。
- 了解如何获取符合性数据。
- 了解如何修正不符合的资源。
- 参阅使用 Azure 管理组来组织资源,了解什么是管理组。