如何检查任何必需的标记是否为空Azure策略

13z8s7eq  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(124)

我正在尝试创建一个审计虚拟机的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"
    }
  }
}
h5qlskok

h5qlskok1#

这至少说起来很棘手,而且似乎没有这样的政策存在。然而,我相信下面的两个选项会成功--至少在我测试的时候是这样的。
备选办法1:

{
    "not": {
      "value": "[contains(string(field('tags')), '\"\"')]",
      "equals": true
    }
  }

备选方案二:

{
    "value": "[indexOf(string(field('tags')), '\"\"')]",
    "greaterOrEquals": 0
  }
    • 说明:**

备选办法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,它将只返回找到项的值-这意味着标记值为空。
链接:

相关问题