Partager via


Baliser des ressources Azure Red Hat OpenShift à l’aide d’Azure Policy

Cet article explique comment utiliser Azure Policy pour baliser les ressources dans le groupe de ressources d’un cluster ARO. Le processus implique la création d’une affectation de rôle et d’un cluster ARO via Azure CLI.

Créer des fichiers JSON

À l’aide d’Azure CLI, procédez comme suit pour créer trois fichiers JSON distincts dans votre répertoire de travail actuel :

  1. Créez un fichier JSON nommé rules.json en copiant et en collant le contenu suivant :

    {
      "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. Créez un fichier JSON nommé param-defs.json en copiant et en collant le contenu suivant :

    {
      "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. Créez un fichier JSON nommé param-values.json en copiant, collant, et en modifiant le contenu suivant :

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

    Ce fichier JSON est le seul des trois fichiers qui doit être modifié. Dans le contenu, spécifiez les valeurs des balises que vous souhaitez appliquer aux ressources du cluster.

    Important

    Le contenu du fichier fourni ci-dessus fournit uniquement une valeur pour le paramètre tag0. La stratégie vous permet de fournir jusqu’à 10 balises, donc si vous souhaitez définir plusieurs balises, ajoutez des valeurs pour les paramètres tag1 à tag9. L’application de plus de 10 balises aux ressources du groupe de ressources managées n’est pas prise en charge.

Définir des variables d’environnement

Ouvrez une session shell et exécutez les commandes suivantes pour définir les variables environnementales à utiliser dans les étapes ultérieures :

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>

Créer la définition et l’affectation de stratégie

  1. Pour créer la définition de stratégie, exécutez la commande suivante :

    az policy definition create -n $POLICY_DEFINITION \
        --mode All \
        --rules rules.json \
        --params param-defs.json
    
  2. Exécutez la commande suivante pour créer l’ attribution de stratégie :

     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
    

Créer le cluster ARO

Suivez les instructions pour créer un cluster ARO. Veillez à passer le paramètre --cluster-resource-group $MANAGED_RESOURCE_GROUP à la commande az aro create lors de la création du cluster.

Remarque

La stratégie n’applique aucune étiquette au réseau virtuel fourni par l’utilisateur.

Corriger les balises à l’aide d’Azure Policy

Vous pouvez corriger les balises précédemment affectées et ajouter de nouvelles balises à l’aide d’une tâche de correction Azure Policy.

Remarque

Ces instructions supposent que vous avez suivi les étapes précédentes pour créer une affectation de stratégie et un cluster, et que vous êtes dans le répertoire contenant les fichiers JSON créés dans ces étapes.

  1. Définissez certaines variables environnementales à utiliser dans les étapes ultérieures. Vous pouvez ignorer cette étape si vous êtes toujours dans la même session shell que celle utilisée pour créer l’affectation de stratégie et le cluster :

    export POLICY_DEFINITION=<your policy definition name here>
    export CLUSTER=<your ARO cluster name here>
    
    export POLICY_ASSIGNMENT="${POLICY_DEFINITION}-${CLUSTER}"
    
  2. Ouvrez le fichier param-values.json. Modifiez les valeurs des paramètres existantes et ajoutez de nouvelles valeurs de paramètres comme vous le souhaitez pour spécifier le nouvel ensemble de balises que la stratégie doit appliquer lorsque vous exécutez la tâche de correction. Exécutez ensuite la commande suivante pour mettre à jour les valeurs des paramètres :

    az policy assignment update -n $POLICY_ASSIGNMENT
    	--params param-values.json
    
  3. Déclenchez la tâche de correction :

    az policy remediation create --resource-group $MANAGED_RESOURCE_GROUP --name myRemediation --policy-assignment $POLICY_ASSIGNMENT
    
    
  4. Autorisez l’exécution de la tâche de correction et observez les balises mises à jour sur le groupe de ressources managé et ses ressources.

Remarque

Les tâches de correction ne suppriment jamais les balises, elles ne font qu'ajouter ou mettre à jour les balises.