Compartir a través de


Etiquetado de recursos de Red Hat OpenShift en Azure mediante Azure Policy

En este artículo se muestra cómo usar Azure Policy para etiquetar los recursos de un grupo de recursos de un clúster de ARO. El proceso implica la creación de una asignación de directiva y un clúster de ARO mediante la CLI de Azure.

Creación de archivos JSON

Con la CLI de Azure, sigue estos pasos para crear tres archivos JSON independientes en el directorio de trabajo actual:

  1. Crea un archivo JSON denominado rules.json copiando y pegando el siguiente contenido:

    {
      "if": {
        "anyOf": [
          {
            "allOf": [
              {
                "value": "[resourceGroup().name]",
                "equals": "[parameters('resourceGroupName')]"
              }
            ]
          },
          {
            "allOf": [
              {
                "field": "name",
                "equals": "[parameters('resourceGroupName')]"
              },
    {
    	     "field": "type",
    	     "equals": "Microsoft.Resources/subscriptions/resourceGroups"
    }
            ]
          }
        ]
      },
      "then": {
        "details": {
          "operations": [
            {
              "condition": "[not(equals(parameters('tag0')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag0')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag0')['tag'][1]]"
            },
            {
              "condition": "[not(equals(parameters('tag1')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag1')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag1')['tag'][1]]"
            },
            {
              "condition": "[not(equals(parameters('tag2')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag2')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag2')['tag'][1]]"
            },
            {
              "condition": "[not(equals(parameters('tag3')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag3')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag3')['tag'][1]]"
            },
            {
              "condition": "[not(equals(parameters('tag4')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag4')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag4')['tag'][1]]"
            },
            {
              "condition": "[not(equals(parameters('tag5')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag5')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag5')['tag'][1]]"
            },
            {
              "condition": "[not(equals(parameters('tag6')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag6')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag6')['tag'][1]]"
            },
            {
              "condition": "[not(equals(parameters('tag7')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag7')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag7')['tag'][1]]"
            },
            {
              "condition": "[not(equals(parameters('tag8')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag8')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag8')['tag'][1]]"
            },
            {
              "condition": "[not(equals(parameters('tag9')['tag'][0], ''))]",
              "field": "[concat('tags[', parameters('tag9')['tag'][0], ']')]",
              "operation": "addOrReplace",
              "value": "[parameters('tag9')['tag'][1]]"
            }
          ],
          "roleDefinitionIds": [
            "/providers/Microsoft.Authorization/roleDefinitions/4a9ae827-6dc8-4573-8ac7-8239d42aa03f"
          ]
        },
        "effect": "modify"
      }
    }
    
  2. Crea un archivo JSON denominado param-defs.json copiando y pegando el siguiente contenido:

    {
      "tag0": {
        "type": "Object",
        "metadata": {
          "displayName": "tag0"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "tag1": {
        "type": "Object",
        "metadata": {
          "displayName": "tag1"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "tag2": {
        "type": "Object",
        "metadata": {
          "displayName": "tag2"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "tag3": {
        "type": "Object",
        "metadata": {
          "displayName": "tag3"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "tag4": {
        "type": "Object",
        "metadata": {
          "displayName": "tag4"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "tag5": {
        "type": "Object",
        "metadata": {
          "displayName": "tag5"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "tag6": {
        "type": "Object",
        "metadata": {
          "displayName": "tag6"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "tag7": {
        "type": "Object",
        "metadata": {
          "displayName": "tag7"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "tag8": {
        "type": "Object",
        "metadata": {
          "displayName": "tag8"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "tag9": {
        "type": "Object",
        "metadata": {
          "displayName": "tag9"
        },
        "defaultValue": {
          "tag": [
            "",
            ""
          ]
        },
        "schema": {
          "type": "object",
          "properties": {
            "tag": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2
            }
          }
        }
      },
      "resourceGroupName": {
        "type": "String",
        "metadata": {
          "displayName": "Resource Group Name",
          "description": "The name of the resource group whose resources you'd like to require the tag on"
        }
      }
    }
    
  3. Crea un archivo JSON denominado param-values.json copiando, pegando y modificando el siguiente contenido:

    {
      "tag0": {
        "value": {
          "tag": [
            "<your tag key here>",
            "<your tag value here>"
          ]
        }
      },
      "resourceGroupName": {
        "value": "<your ARO cluster's managed resource group name here>"
      }
    }
    

    Este archivo JSON es el único de los tres archivos que se debe modificar. En el contenido, especifica los valores de las etiquetas que quieres aplicar a los recursos del clúster.

    Importante

    El contenido del archivo proporcionado anteriormente solo aporta un valor para el parámetro tag0. La directiva permite proporcionar hasta 10 etiquetas, por lo que si quieres establecer más de una etiqueta, agrega valores para los parámetros de la etiqueta 1 a la 9. No se admite la aplicación de más de 10 etiquetas a los recursos del grupo de recursos administrado.

Establecimiento de variables de entorno

Abre una sesión de shell y ejecuta los siguientes comandos para establecer las variables de entorno que se usarán en pasos posteriores:

export AZURE_SUBSCRIPTION_ID=<your Azure subscription ID here>
export POLICY_DEFINITION=<your policy definition name here>
export CLUSTER=<your ARO cluster name here>
export MANAGED_RESOURCE_GROUP=<your ARO cluster's managed resource group name here>

export POLICY_ASSIGNMENT="${POLICY_DEFINITION}-${CLUSTER}"

# This will be used to determine the region in which the policy assignment's managed identity is created.
# (See here for more info about the managed identity: https://learn.microsoft.com/en-us/azure/governance/policy/how-to/remediate-resources?tabs=azure-portal#configure-the-managed-identity)
export LOCATION=<the Azure region you want to use here>

Creación de la definición y asignación de directiva

  1. Ejecuta el siguiente comando para crear la asignación de directiva:

    az policy definition create -n $POLICY_DEFINITION \
        --mode All \
        --rules rules.json \
        --params param-defs.json
    
  2. Ejecute el siguiente comando para crear una asignación de directiva:

     az policy assignment create -n $POLICY_ASSIGNMENT \
    	--policy $POLICY_DEFINITION \
    	--scope "/subscriptions/${AZURE_SUBSCRIPTION_ID}" \
    	--location $LOCATION \
    	--mi-system-assigned \
    	--role "Tag Contributor" \
    	--identity-scope "/subscriptions/${AZURE_SUBSCRIPTION_ID}" \
    	--params param-values.json
    

Creación del clúster de ARO

Sigue las instrucciones para crear un clúster de ARO. Asegúrate de pasar el parámetro --cluster-resource-group $MANAGED_RESOURCE_GROUP al comando az aro create al crear el clúster.

Nota:

La directiva no aplica ninguna etiqueta a la red virtual proporcionada por el usuario.

Corrección de las etiquetas mediante Azure Policy

Puedes corregir etiquetas asignadas previamente y agregar nuevas etiquetas mediante una tarea de corrección de Azure Policy.

Nota:

En estas instrucciones se da por hecho que has seguido los pasos anteriores para crear una asignación de directiva y un clúster, y que te encuentras en el directorio que contiene los archivos JSON creados en esos pasos.

  1. Establece algunas variables de entorno que se usarán en pasos posteriores. Puedes omitir este paso si todavía estás en la misma sesión de shell que usaste para crear la asignación de directiva y el clúster:

    export POLICY_DEFINITION=<your policy definition name here>
    export CLUSTER=<your ARO cluster name here>
    
    export POLICY_ASSIGNMENT="${POLICY_DEFINITION}-${CLUSTER}"
    
  2. Abra el archivo param-values.json. Modifica los valores de los parámetros existentes y agrega nuevos valores de parámetro como quieras para especificar el nuevo conjunto de etiquetas que debe aplicar la directiva al ejecutar la tarea de corrección. Después, ejecuta el siguiente comando para actualizar los valores de parámetro:

    az policy assignment update -n $POLICY_ASSIGNMENT
    	--params param-values.json
    
  3. Desencadena la tarea de corrección:

    az policy remediation create --resource-group $MANAGED_RESOURCE_GROUP --name myRemediation --policy-assignment $POLICY_ASSIGNMENT
    
    
  4. Permite que el tiempo de la tarea de corrección se ejecute y observa las etiquetas que se actualizan en el grupo de recursos administrado y sus recursos.

Nota:

Las tareas de corrección nunca quitan etiquetas, solo las agregan o actualizan.