Patrón de Azure Policy: etiquetas

Las etiquetas son una parte importante de la administración, organización y control de los recursos de Azure. Azure Policy permite configurar etiquetas en los recursos nuevos y existentes a escala con el efecto modificar y las tareas de corrección.

Muestra 1: Parametrizar

Esta definición de directiva usa dos parámetros, tagName y tagValue, para establecer lo que busca la asignación de directiva en los grupos de recursos. Este formato permite usar la definición de directiva para cualquier número de combinaciones de nombre de etiqueta y valor de etiqueta, pero solo se mantiene una única definición de directiva.

Nota

Aunque este patrón de definición de directiva es similar al de Patrón: Parámetros: ejemplo n.° 1, en este ejemplo se usa el modoTodos y se destina a los grupos de recursos.

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

Muestra 1: Explicación

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

En este ejemplo, el modo se establece en Todos, ya que tiene como destino un grupo de recursos. En la mayoría de los casos, el modo debe establecerse en Indizado al trabajar con etiquetas. Para más información, consulte los modos.

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

En esta parte de la definición de la directiva, concat combina el parámetro tagName con parámetros y el formato tags['name'] para indicar al campo que evalúe la etiqueta del parámetro tagValue. Como se usa notEquals, si la etiqueta[tagValue] no es igual que tagValue, se desencadena el efecto modificar.

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

En este caso, la operación addOrReplace utiliza el mismo formato para usar los valores de etiqueta con parámetros a fin de crear o actualizar la etiqueta con el valor deseado en el grupo de recursos evaluado.

Ejemplo 2: Herencia de valor de una etiqueta del grupo de recursos

Esta definición de directiva usa el parámetro tagName para determinar el valor de la etiqueta que se va a heredar del grupo de recursos primario.

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

Ejemplo 2: Explicación

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

En este ejemplo, el modo se establece en Indizado, ya que no tiene como destino un grupo de recursos ni una suscripción a pesar de que obtiene el valor de un grupo de recursos. Para más información, consulte los modos.

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

policyRule.if usa concat como Ejemplo n.º 1 para evaluar el valor de tagName, pero utiliza la función resourceGroup() para compararlo con el valor de la misma etiqueta en el grupo de recursos primario. La segunda cláusula comprueba que la etiqueta del grupo de recursos tenga un valor y no sea NULL.

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

Aquí, el valor que se asigna a la etiqueta tagName en el recurso también utiliza la función resourceGroup() para obtener el valor del grupo de recursos primario. De esta manera, puede heredar etiquetas de grupos de recursos primarios. Si ya ha creado el recurso pero no ha agregado la etiqueta, esta misma definición de directiva y una tarea de corrección pueden actualizar los recursos existentes.

Pasos siguientes