Шаблон Политики Azure: теги

Теги — это важная часть управления ресурсами Azure и их упорядочивания и контроля. Политика Azure позволяет настроить теги для новых и существующих ресурсов в большом масштабе с помощью действия modify и задач исправления.

Пример 1. Параметризация тегов

Это определение политики использует два параметра: tagName и tagValue. Эти параметры указывают, что именно будет искать назначение политики в группах ресурсов. Этот формат позволяет использовать определение политики для любого количества сочетаний имен тегов и значений тегов, но поддерживает только одно определение политики.

Примечание

Хотя этот шаблон определения политики похож на шаблон из раздела Пример 1: параметры строки, в этом примере параметр mode имеет значение All и нацелен на группы ресурсов.

{
    "properties": {
        "displayName": "Add or replace a tag on resource groups",
        "mode": "All",
        "description": "Adds or replaces the specified tag and value when any resource group is created or updated. Existing resource groups can be remediated by triggering a remediation task.",
        "metadata": {
            "category": "Tags"
        },
        "parameters": {
            "tagName": {
                "type": "String",
                "metadata": {
                    "displayName": "Tag Name",
                    "description": "Name of the tag, such as 'environment'"
                }
            },
            "tagValue": {
                "type": "String",
                "metadata": {
                    "displayName": "Tag Value",
                    "description": "Value of the tag, such as 'production'"
                }
            }
        },
        "policyRule": {
            "if": {
                "allOf": [{
                        "field": "type",
                        "equals": "Microsoft.Resources/subscriptions/resourceGroups"
                    },
                    {
                        "field": "[concat('tags[', parameters('tagName'), ']')]",
                        "notEquals": "[parameters('tagValue')]"
                    }
                ]
            },
            "then": {
                "effect": "modify",
                "details": {
                    "roleDefinitionIds": [
                        "/providers/microsoft.authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
                    ],
                    "operations": [{
                        "operation": "addOrReplace",
                        "field": "[concat('tags[', parameters('tagName'), ']')]",
                        "value": "[parameters('tagValue')]"
                    }]
                }
            }
        }
    }
}

Пример 1. Объяснение

"properties": {
    "displayName": "Add or replace a tag on resource groups",
    "mode": "All",
    "description": "Adds or replaces the specified tag and value when any resource group is created or updated. Existing resource groups can be remediated by triggering a remediation task.",
    "metadata": {
        "category": "Tags"
    },

В этом примере параметр mode имеет значение All, так как он нацелен на группу ресурсов. В большинстве случаев при работе с тегами параметр mode должен иметь значение Indexed. Дополнительные сведения см. в разделе о режимах.

"if": {
    "allOf": [{
            "field": "type",
            "equals": "Microsoft.Resources/subscriptions/resourceGroups"
        },
        {
            "field": "[concat('tags[', parameters('tagName'), ']')]",
            "notEquals": "[parameters('tagValue')]"
        }
    ]
},

В этой части определения политики concat объединяет параметризованный параметр tagName и формат tags['name'], чтобы сообщить field произвести оценку этого тега для параметра tagValue. Поскольку используется notEquals, если значение tags[tagName] не равно tagValue, активируется действие modify.

"operations": [{
    "operation": "addOrReplace",
    "field": "[concat('tags[', parameters('tagName'), ']')]",
    "value": "[parameters('tagValue')]"
}]

Здесь операция addOrReplace использует тот же формат значений параметризованного тега для создания тега и обновления его значения до требуемого в оцениваемой группе ресурсов.

Пример 2. Наследование значения тега из группы ресурсов

Это определение политики использует параметр tagName, чтобы определить значение тега, которое следует унаследовать от родительской группы ресурсов.

{
    "properties": {
        "displayName": "Inherit a tag from the resource group",
        "mode": "Indexed",
        "description": "Adds or replaces the specified tag and value from the parent resource group when any resource is created or updated. Existing resources can be remediated by triggering a remediation task.",
        "metadata": {
            "category": "Tags"
        },
        "parameters": {
            "tagName": {
                "type": "String",
                "metadata": {
                    "displayName": "Tag Name",
                    "description": "Name of the tag, such as 'environment'"
                }
            }
        },
        "policyRule": {
            "if": {
                "allOf": [{
                        "field": "[concat('tags[', parameters('tagName'), ']')]",
                        "notEquals": "[resourceGroup().tags[parameters('tagName')]]"
                    },
                    {
                        "value": "[resourceGroup().tags[parameters('tagName')]]",
                        "notEquals": ""
                    }
                ]
            },
            "then": {
                "effect": "modify",
                "details": {
                    "roleDefinitionIds": [
                        "/providers/microsoft.authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
                    ],
                    "operations": [{
                        "operation": "addOrReplace",
                        "field": "[concat('tags[', parameters('tagName'), ']')]",
                        "value": "[resourceGroup().tags[parameters('tagName')]]"
                    }]
                }
            }
        }
    }
}

Пример 2. Объяснение

"properties": {
    "displayName": "Inherit a tag from the resource group",
    "mode": "Indexed",
    "description": "Adds or replaces the specified tag and value from the parent resource group when any resource is created or updated. Existing resources can be remediated by triggering a remediation task.",
    "metadata": {
        "category": "Tags"
    },

В этом примере параметр mode имеет значение Indexed, так как он не нацелен на группу ресурсов или подписку, несмотря на то, что получает значение из группы ресурсов. Дополнительные сведения см. в разделе о режимах.

"if": {
    "allOf": [{
            "field": "[concat('tags[', parameters('tagName'), ']')]",
            "notEquals": "[resourceGroup().tags[parameters('tagName')]]"
        },
        {
            "value": "[resourceGroup().tags[parameters('tagName')]]",
            "notEquals": ""
        }
    ]
},

policyRule.if использует concat, как в примере 1, для вычисления значения tagName, а также использует функцию resourceGroup() для сравнения этого значения со значением того же тега в родительской группе ресурсов. Второе предложение проверяет, имеет ли тег в группе ресурсов значение, отличное от NULL.

"operations": [{
    "operation": "addOrReplace",
    "field": "[concat('tags[', parameters('tagName'), ']')]",
    "value": "[resourceGroup().tags[parameters('tagName')]]"
}]

В этой части значение, присваиваемое тегу tagName в ресурсе, также использует функцию resourceGroup() для получения значения из родительской группы ресурсов. Таким образом можно наследовать теги от родительских групп ресурсов. Если вы уже создали ресурс, но еще не добавили тег, это же определение политики и задача исправления могут обновлять существующие ресурсы.

Дальнейшие действия