【问题标题】:How to check if any required tags are blank Azure Policy如何检查任何必需的标记是否为空白 Azure Policy
【发布时间】:2023-02-06 19:27:39
【问题描述】:

我正在尝试创建一个审核 vms 的 azure 策略。我要满足的条件是 vm 具有参数指定的所有标签,并且所有这些对应的标签都包含一个值。我在下面使用的第一个条件。然而,要确定它们是否为空白有点更具挑战性,因为看起来您不能在字段键中使用 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"
    }
  }
}

【问题讨论】:

  • 是的。我知道我可以通过 cli、powershell 和 graph api 来做,但如果我可以添加为策略,那么它会得到一致的审计。

标签: json azure tags azure-policy


【解决方案1】:

至少这很难说,而且似乎不存在这样的政策。不过,我相信下面的两个选项可以解决问题——至少在我测试时是这样的。

选项1:

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

选项 2:

  {
    "value": "[indexOf(string(field('tags')), '""')]",
    "greaterOrEquals": 0
  }

描述:
选项1:
使用 contains 检查对象是否包含键或字符串是否包含子字符串。
container 包含嵌套参数。
string 将指定值转换为字符串。在这种情况下,指定的值是 field = tags,它们是对象,而不是数组。在这种情况下,指定的值是字段 = 标记,它们是 objects,而不是 array。 2 个标签的示例,值为“value1”的“tagnumber1”和值为空的“tagnumber2”:
"{"tagnumber1":"value1","tagnumber2":""}"
请注意,空值为 "" - 这是我们的 itemToFind

选项 2:
使用 indexOf 返回字符串中值的第一个位置。
stringToSearch 包含嵌套参数。
stringToFind 是空的。
string 将指定值转换为字符串。在这种情况下,指定的值是 field = tags,即 objects,而不是 array
2 个标签的示例,值为“value1”的“tagnumber1”和值为空的“tagnumber2”:
"{"tagnumber1":"value1","tagnumber2":""}"
请注意,空值为 ""
因此,我们必须搜索 "",因为它代表对象中的空值。 该指数是从零开始的。如果未找到该项,则返回 -1。一个整数表示项目的第一个索引,因此通过查看"greaterOrEquals": 0,它只会返回找到项目的信息——这意味着标签值为空。

链接:

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多