我正在尝试创建一个审计虚拟机的Azure策略。我希望满足的条件是虚拟机具有参数指定的所有标记,并且所有这些对应的标记都包含一个值。下面是我使用的第一个条件。但是,确定它们是否为空有点更具挑战性,因为看起来你不能在字段键中使用current()。
{
"parameters": {
"requiredTags": {
"type": "Array",
"metadata": {
"displayName": "Required Tags",
"description": "The list of tags that should exist on the virtual machine"
}
}
},
"policyRule": {
"if": {
"allof": [
{
"field": "type",
"equals": "Microsoft.Compute/VirtualMachines"
},
{
"count": {
"value": "[parameters('requiredTags')]",
"where": {
"field": "tags",
"containsKey": "[current()]"
}
},
"notEquals": "[length(parameters('requiredTags'))]"
},
{
"count": {
"value": "[parameters('requiredTags')]",
"where": {
"field": "[concat('tags[', current(), ']')]",
"notEquals": ""
}
},
"notEquals": "[length(parameters('requiredTags'))]"
}
]
},
"then": {
"effect": "audit"
}
}
}
1条答案
按热度按时间h5qlskok1#
这至少说起来很棘手,而且似乎没有这样的政策存在。然而,我相信下面的两个选项会成功--至少在我测试的时候是这样的。
备选办法1:
备选方案二:
备选办法1:
使用
contains
检查对象是否包含键,字符串是否包含子字符串。container
包含嵌套参数。string
将指定的值转换为字符串。在本例中,指定的值是field = tags
,它们是对象,而不是数组。在本例中,指定的值是field = tags,它们是objects
,而不是array
。2个标记的示例,值为"value1"的"tagnumber1"和值为空的"tagnumber2":"{\"tagnumber1\":\"value1\",\"tagnumber2\":\"\"}"
注意,空值是
\"\"
-这是我们的itemToFind
。备选方案二:
使用
indexOf
返回字符串中值的第一个位置。stringToSearch
包含嵌套参数。stringToFind
为空。string
将指定值转换为字符串。在本例中,指定值为field = tags
,即objects
,而不是array
。2个标记的示例,值为"value1"的"tagnumber1"和值为空的"tagnumber2":
"{\"tagnumber1\":\"value1\",\"tagnumber2\":\"\"}"
请注意,空值为
\"\"
。因此,我们必须搜索
\"\"
,因为它表示对象中的空值。索引从零开始。如果没有找到项,则返回-1。整数表示项的第一个索引,因此通过查看"greaterOrEquals": 0
,它将只返回找到项的值-这意味着标记值为空。链接: