Modèle Azure Policy : étiquettes

Les étiquettes représentent un élément important dans la gestion, l’organisation et l’administration de vos ressources Azure. Azure Policy permet de configurer à grande échelle des étiquettes sur vos ressources nouvelles et existantes au moyen de l’effet modify et des tâches de correction.

Exemple 1 : Paramétrer des étiquettes

Cette définition de stratégie utilise deux paramètres (tagName et tagValue) pour définir ce que l’attribution de stratégie doit rechercher dans les groupes de ressources. Ce format permet à la définition de stratégie d’être utilisée avec autant de combinaisons nom-valeur d’étiquette que souhaité. Toutefois, il ne conserve qu’une seule définition de stratégie.

Notes

Bien que ce modèle de définition de stratégie soit similaire à celui de Modèle : Paramètres – Exemple no1, cet exemple utilise mode All et cible des groupes de ressources.

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

Exemple 1 : Explication

"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"
    },

Dans cet exemple, mode a la valeur All, car il cible un groupe de ressources. Dans la plupart des cas, mode doit avoir la valeur Indexed lors de l’utilisation d’étiquettes. Pour plus d’informations, consultez modes.

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

Dans cette partie de la définition de stratégie, concat associe le paramètre tagName paramétrable au format tags['name'] pour indiquer à field d’évaluer cette étiquette pour le paramètre tagValue. Lorsque notEquals est utilisé, si tags[tagName] n’est pas égal à tagValue, l’effet modify est déclenché.

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

Ici, pour créer l’étiquette ou la mettre à jour à la valeur souhaitée sur le groupe de ressources évalué, le même format que celui de l’utilisation de valeurs d’étiquettes paramétrables est utilisé par l’opération addOrReplace.

Exemple 2 : Hériter du groupe de ressources la valeur d’étiquette

Cette définition de stratégie utilise le paramètre tagName pour déterminer de quelle valeur de l’étiquette hériter à partir du groupe de ressources parent.

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

Exemple 2 : Explication

"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"
    },

Dans cet exemple, mode a la valeur Indexed, car il ne cible pas un groupe de ressources ni un abonnement, bien qu’il obtienne la valeur d’un groupe de ressources. Pour plus d’informations, consultez modes.

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

policyRule.if utilise concat, comme dans Exemple no1, pour évaluer la valeur de tagName, mais se sert de la fonction resourceGroup() pour la comparer à la valeur de la même étiquette sur le groupe de ressources parent. La seconde clause ici vérifie que l’étiquette sur le groupe de ressources a une valeur, et qu’elle n’est pas nulle.

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

Ici, la valeur assignée à l’étiquette tagName sur la ressource utilise également la fonction resourceGroup() pour récupérer la valeur à partir du groupe de ressources parent. Ainsi, vous pouvez hériter d’étiquettes provenant de groupes de ressources parent. Si vous avez déjà créé la ressource, mais que vous n’avez pas ajouté l’étiquette, cette même définition de stratégie et une tâche de correction peuvent mettre à jour les ressources existantes.

Étapes suivantes