Политика и инициатива для копирования тегов на ресурсы в группе ресурсов
Я изо всех сил пытаюсь создать параметризованную версию примера политики 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 со значением в группе ресурсов. В документации говорится, что причина "Текущее значение должно существовать" - это условие существования. Кажется, это противоречит тому, как я ожидаю, что это сработает - я знаю, что его не существует, поэтому я хочу установить значение.
Есть ли способ отладить их, кроме назначения политики и ожидания результата в течение нескольких часов?
Спасибо за вашу помощь!
1 ответ
Я понял это, мой синтаксис был неправильным, мне нужно ссылаться на теги, используя ключи, а не атрибуты, то есть теги ['ApplicationName'], а не теги.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, как несовместимый".