我正在努力创建Azure策略示例的参数化版本,该示例将应用于资源组的标签复制到其中的任何资源。这是我用作启发的示例:https://github.com/Azure/azure-policy/tree/master/samples/ResourceGroup/copy-resourcegroup-tag,即:
{
"if": {
"field": "tags.example",
"exists": "false"
},
"then": {
"effect": "append",
"details": [
{
"field": "tags.example",
"value": "[resourceGroup().tags.example]"
}
]
}
}
我们向资源组添加了许多标签,出于计费目的,我需要确保将这些标签应用于其中的所有资源。我希望创建一个包含多次相同策略的计划,每次使用不同的参数化标签名称。我的示例策略的参数化版本如下所示:
"parameters": {
"tagName": {
"type": "String",
"metadata": {
"displayName": "Tag name",
"description": "The tag to copy to child resources"
}
}
},
"policyRule": {
"if": {
"field": "[concat('tags.', parameters('tagName'))]",
"exists": "false"
},
"then": {
"effect": "append",
"details": [
{
"field": "[concat('tags.', parameters('tagName'))]",
"value": "[concat('resourceGroup().tags.', parameters('tagName'))]"
}
]
}
}
当该政策适用时,我会得出不合规的结果。查看合规性详细信息显示:
违规原因
当前值必须存在。
字段
tags.ApplicationName
当前值
-
在资源组上有一个名为 ApplicationName 的标签。 documentation说“当前值必须存在”的原因是 exists 条件。这似乎与我期望的工作方式有悖常理-我知道它不存在,这就是为什么我要设置该值。
除了分配策略并等待几个小时才能得到结果之外,是否还有其他方法可以调试这些信息?
感谢您的帮助!
答案 0 :(得分:0)
我已经弄清楚了,我的语法是错误的,我需要使用键而不是作为属性来引用标签,即 tags ['ApplicationName'] 而不是 tags。 ApplicationName 。 policyRule属性必须为:
"policyRule": {
"if": {
"field": "[concat('tags[', parameters('tagName'), ']')]",
"exists": "false"
},
"then": {
"effect": "append",
"details": [
{
"field": "[concat('tags[', parameters('tagName'), ']')]",
"value": "[resourceGroup().tags[parameters('tagName')]]"
}
]
}
}
我也误解了此功能的工作原理,似乎具有附加效果的策略只能在资源创建时追加,而不能追溯地添加到现有资源上。上述政策为新资源添加了标签,但会为现有资源生成“不合规”报告。
此行为已记录为here:
“当使用附加效果的策略定义作为评估周期的一部分运行时,它不会对已经存在的资源进行更改。而是将满足if条件的任何资源标记为不符合。”