Azure Policy 计划定义结构

使用计划可组合多个相关策略定义,以简化分配和管理,因为可将组作为单个项使用。 例如,可以将相关标记策略组合为单个计划。 将应用计划,而非单独分配每个策略。

使用 JSON 创建策略计划定义。 策略计划定义包含以下各项的元素:

  • 显示名称
  • description
  • metadata
  • parameters
  • 策略定义

下面的示例演示如何创建用于处理 costCenterproductName 这两个标记的计划。 它使用两个内置策略来应用默认标记值。

{
    "properties": {
        "displayName": "Billing Tags Policy",
        "policyType": "Custom",
        "description": "Specify cost Center tag and product name tag",
        "metadata": {
            "version": "1.0.0",
            "category": "Tags"
        },
        "parameters": {
            "costCenterValue": {
                "type": "String",
                "metadata": {
                    "description": "required value for Cost Center tag"
                },
                "defaultValue": "DefaultCostCenter"
            },
            "productNameValue": {
                "type": "String",
                "metadata": {
                    "description": "required value for product Name tag"
                },
                "defaultValue": "DefaultProduct"
            }
        },
        "policyDefinitions": [{
                "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62",
                "parameters": {
                    "tagName": {
                        "value": "costCenter"
                    },
                    "tagValue": {
                        "value": "[parameters('costCenterValue')]"
                    }
                }
            },
            {
                "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/2a0e14a6-b0a6-4fab-991a-187a4f81c498",
                "parameters": {
                    "tagName": {
                        "value": "costCenter"
                    },
                    "tagValue": {
                        "value": "[parameters('costCenterValue')]"
                    }
                }
            },
            {
                "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62",
                "parameters": {
                    "tagName": {
                        "value": "productName"
                    },
                    "tagValue": {
                        "value": "[parameters('productNameValue')]"
                    }
                }
            },
            {
                "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/2a0e14a6-b0a6-4fab-991a-187a4f81c498",
                "parameters": {
                    "tagName": {
                        "value": "productName"
                    },
                    "tagValue": {
                        "value": "[parameters('productNameValue')]"
                    }
                }
            }
        ]
    }
}

Azure Policy 内置项和模式位于 Azure Policy 示例

Metadata

可选 metadata 属性存储关于策略计划定义的信息。 客户可在 metadata 中定义对其组织有用的任何属性和值。 但是,Azure Policy 和内置项使用一些常见属性。

常见元数据属性

  • version(字符串):跟踪有关策略计划定义的内容版本的详细信息。

  • category(字符串):确定在 Azure 门户中的哪个类别下显示策略定义。

  • preview(布尔值):如果策略计划定义为“预览版”,则为 true 或 false 标志。

  • deprecated(布尔值):如果策略计划定义被标记为“已弃用”,则为 true 或 false 标志。

注意

Azure Policy 服务会使用 versionpreviewdeprecated 属性,将变更级别传达给内置策略定义或计划和状态。 version 的格式为:{Major}.{Minor}.{Patch}。 特定状态(例如“弃用”或“预览版”)会附加至 属性,或另一个属性中附加为“布尔值”。 有关 Azure Policy 内置项版本控制方式的详细信息,请参阅内置项版本控制

parameters

参数可减少策略定义的数量,有助于简化策略管理。 可以将参数想象成窗体上的字段 - nameaddresscitystate。 这些参数始终不变,但其值会基于窗体中的各填写内容变化。 构建策略计划时,参数同样适用。 通过在策略计划定义中包含参数,可以在包含的策略中重复使用该参数。

注意

一旦分配计划后,就不能再更改计划级别参数。 因此,建议在定义参数时设置 defaultValue。

参数属性

参数有下述可以在策略计划定义中使用的属性:

  • name:参数的名称。 由策略规则中的 parameters 部署函数使用。 有关详细信息,请参阅使用参数值
  • type:确定参数是否为“字符串”、“数组”、“对象”、“布尔值”、“整数”、“浮点数”或者“日期/时间”。
  • metadata:定义主要由 Azure 门户用来显示用户友好信息的子属性:
    • description:(可选)说明参数用途。 可以用来提供可接受值的示例。
    • displayName:在门户中显示的用于参数的友好名称。
    • strongType:(可选)通过门户分配策略定义时使用。 提供上下文感知列表。 有关详细信息,请参阅 strongType
  • defaultValue:(可选)设置分配的参数的值(如果值未给定)。
  • allowedValues:(可选)提供参数在分配过程中所接受值的数组。

例如,可以定义策略计划定义,以限制各种包含的策略定义中的资源位置。 allowedLocations 可以是该策略计划定义的一个参数。 然后,该参数可用于每个包含的策略定义,并在分配策略计划期间定义。

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

将参数值传递到策略定义

声明要将哪些计划参数传递到计划定义的 policyDefinitions 数组中的哪些包含的策略定义。 尽管参数名称可以是相同的,但在计划中使用与策略定义中不同的名称可以简化代码以提升可读性。

例如,可以将之前定义的 init_allowedLocations 计划参数传递到多个包含的策略定义及其参数 sql_locations 和 vm_locations,如下所示 :

"policyDefinitions": [
    {
        "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/0ec8fc28-d5b7-4603-8fec-39044f00a92b",
        "policyDefinitionReferenceId": "allowedLocationsSQL",
        "parameters": {
            "sql_locations": {
                "value": "[parameters('init_allowedLocations')]"
            }
        }
    },
    {
        "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/aa09bd0f-aa5f-4343-b6ab-a33a6a6304f3",
        "policyDefinitionReferenceId": "allowedLocationsVMs",
        "parameters": {
            "vm_locations": {
                "value": "[parameters('init_allowedLocations')]"
            }
        }
    }
]

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

strongType

metadata 属性中,可以使用 strongType 来提供 Azure 门户中的一个包含选项的多选列表。 strongType 可以是受支持的资源类型,也可以是允许值。 若要确定“资源类型”是否对“strongType”有效,请使用 Get-AzResourceProvider

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

  • Microsoft.RecoveryServices/vaults/backupPolicies

strongType 的非资源类型允许值有:

  • location
  • resourceTypes
  • storageSkus
  • vmSKUs
  • existingResourceGroups

策略定义

计划定义的 policyDefinitions 部分是一个数组,其中现有策略定义包含在该计划中。 如将参数值传递到策略定义中所述,此属性是将计划参数传递到策略定义的位置。

策略定义属性

每个表示策略定义的数组元素具有以下属性:

  • policyDefinitionId(字符串):要包含的自定义或内置策略定义的 ID。
  • policyDefinitionReferenceId(字符串):包含的策略定义的短名称。
  • parameters:(可选)用于将计划参数作为该策略定义中的属性传递到包含的策略定义的名称/值对。 有关详细信息,请参阅参数

下面是 policyDefinitions 的一个示例,它有两个包含的策略定义,会向这两个策略定义分别传递相同的计划参数:

"policyDefinitions": [
    {
        "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/0ec8fc28-d5b7-4603-8fec-39044f00a92b",
        "policyDefinitionReferenceId": "allowedLocationsSQL",
        "parameters": {
            "sql_locations": {
                "value": "[parameters('init_allowedLocations')]"
            }
        }
    },
    {
        "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/aa09bd0f-aa5f-4343-b6ab-a33a6a6304f3",
        "policyDefinitionReferenceId": "allowedLocationsVMs",
        "parameters": {
            "vm_locations": {
                "value": "[parameters('init_allowedLocations')]"
            }
        }
    }
]

后续步骤