json - 如何检查任何必需的标签是否为空 Azure Policy

标签 json azure tags azure-policy

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

最佳答案

这至少可以说是非常棘手的,而且似乎不存在这样的政策。尽管如此,我相信下面的 2 个选项可以解决问题 - 至少在我测试时是这样。

选项 1:

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

选项 2:

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

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

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

链接:

关于json - 如何检查任何必需的标签是否为空 Azure Policy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75197850/

相关文章:

java - Spring + Jackson 不支持内容类型 'application/json;charset=UTF-8'

python - 如何在 Python 中使用 BeautifulSoup 删除 HTML 标签之间的空格?

asp.net-mvc - 从 HTTP 重定向到 HTTPS 时,Windows Azure ASP.NET MVC 角色行为异常

.net - 如何从 Devops 管道将 azure 函数发布到 Active Directory 中的 Azure Linux 函数

html - 我们可以在 <li> 中给 <div>

php - 如何从 mysql 数据中删除 <br> 以外的 html 标签?

python - JSONEncoder 子类化出错

json - 如何使用 postman 测试表单数据?

json - 如何使用 Powershell 将 JSON 对象保存到文件中?

azure - 如何将测试失败屏幕截图附加到 YAML 中的 Azure Pipeline 测试运行?