0

我正在努力创建 Azure Policy 示例的参数化版本,它将应用于资源组的标签复制到其中的任何资源。这是我用作灵感的示例: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的标记,其值为。文档说“当前值必须存在”的原因是存在条件。这似乎与我期望它起作用的方式有悖常理——我知道它不存在,这就是我要设置该值的原因。

除了分配策略并等待几个小时得到结果之外,还有什么方法可以调试这些?

谢谢你的帮助!

4

1 回答 1

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')]]"
      }
    ]
  }
}

我也误解了这个功能是如何工作的,似乎具有附加效果的策略只能在资源创建时附加,而不是在现有资源上追溯。上述策略为新资源添加标签,但导致现有资源的“不合规”报告。

此行为如此处所述

“当使用附加效果的策略定义作为评估周期的一部分运行时,它不会对已经存在的资源进行更改。相反,它会将满足 if 条件的任何资源标记为不合规。”

于 2019-04-25T12:06:43.550 回答