将标签复制到资源组中资源的政策和倡议

时间:2019-04-25 07:14:48

标签: azure azure-policy

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

除了分配策略并等待几个小时才能得到结果之外,是否还有其他方法可以调试这些信息?

感谢您的帮助!

1 个答案:

答案 0 :(得分: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')]]"
      }
    ]
  }
}

我也误解了此功能的工作原理,似乎具有附加效果的策略只能在资源创建时追加,而不能追溯地添加到现有资源上。上述政策为新资源添加了标签,但会为现有资源生成“不合规”报告。

此行为已记录为here

  

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