Markieren von Azure Red Hat OpenShift-Ressourcen mithilfe von Azure Policy

In diesem Artikel erfahren Sie, wie Sie mithilfe von Azure-Richtlinien Tags auf die Ressourcen in der verwalteten Ressourcengruppe eines Azure Red Hat OpenShift-Clusters anwenden. Sie erstellen drei JSON-Dateien, um eine Richtliniendefinition und Richtlinienzuweisung im Abonnementbereich zu erstellen. Sie stellen einen Cluster bereit, der die Tags der Richtlinie verwendet, und verwenden eine Richtlinienkorrekturaufgabe, um Tags auf Clusterressourcen anzuwenden.

Voraussetzungen

Erstellen von JSON-Dateien

Verwenden Sie einen Text-Editor wie Microsoft Visual Studio Code, um den folgenden Code zu kopieren und einzufügen, und erstellen Sie drei JSON-Dateien in Ihrem aktuellen Arbeitsverzeichnis. Diese Dateien werden verwendet, um Ihre Richtliniendefinition und Richtlinienzuweisung zu erstellen.

Regeldatei erstellen

Erstellen Sie die rules.json Datei.

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

Erstellen von Parameterdefinitionen

Erstellen Sie die param-defs.json Datei.

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

Erstellen Sie die param-values.json Datei.

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

Diese param-values.json Datei ist die einzige der drei Dateien, die geändert werden müssen. Geben Sie im Inhalt die Werte für die Tags an, die auf die Ressourcen des Clusters angewendet werden sollen. Ersetzen Sie in diesem Beispiel die folgenden Werte:

  • <your tag key>: demoKey
  • <your tag value>: demoResourceGroupTag
  • <your cluster's managed resource group name>: demoMRG

Der param-values.json Dateiinhalt zeigt nur einen Wert für den tag0 Parameter an. Die Richtlinie gestattet bis zu 10 Tags. Wenn Sie mehrere Tags festlegen möchten, fügen Sie Werte für Parameter tag1 über tag 9. Das Anwenden von mehr als 10 Tags auf Ressourcen in der verwalteten Ressourcengruppe wird nicht unterstützt.

Festlegen von Umgebungsvariablen

Öffnen Sie eine Bash-Shell, melden Sie sich bei Azure an, und erstellen Sie Variablen.

Wenn Sie Azure CLI auf Ihrem Computer verwenden, melden Sie sich über Ihre Bash-Sitzung bei Ihrem Azure-Abonnement an. Weitere Informationen finden Sie unter Authentifizieren bei Azure mithilfe der Azure CLI.

az login

Erstellen Von Umgebungsvariablen, die in späteren Schritten verwendet werden. Sie können die bereitgestellten Werte verwenden oder eigene Werte erstellen.

export AZURE_SUBSCRIPTION_ID=$(az account list --query [].id --output tsv)
export POLICY_DEFINITION=demoPolicyDefName
export CLUSTER=demoCluster
export MANAGED_RESOURCE_GROUP=demoMRG
export POLICY_ASSIGNMENT="${POLICY_DEFINITION}-${CLUSTER}"
export LOCATION=centralus
Variablenname Description
AZURE_SUBSCRIPTION_ID Das Azure-Abonnement, in dem Ressourcen erstellt werden. Der Befehl ruft die ID aus dem Azure-Abonnement ab, bei dem Sie angemeldet sind.
POLICY_DEFINITION Der Name Ihrer Richtliniendefinition zum Anwenden von Ressourcentags. In diesem Beispiel demoPolicyDefName.
CLUSTER Der Name Ihres Azure Red Hat OpenShift-Clusters. In diesem Beispiel demoCluster.
MANAGED_RESOURCE_GROUP Die Verwaltete Ressourcengruppe, die die Ressourcen Ihres Clusters enthält. In diesem Beispiel demoMRG.
POLICY_ASSIGNMENT Name, der durch das Verbinden der Variablennamen POLICY_DEFINITION und CLUSTER erstellt wurde.
LOCATION Region, in der die verwaltete Identität der Richtlinienzuweisung erstellt wird. In diesem Beispiel centralus. Weitere Informationen zur verwalteten Identität finden Sie unter Konfigurieren der verwalteten Identität.

Erstellen der Richtliniendefinition und -zuweisung

  1. Führen Sie zum Erstellen der Richtliniendefinition den folgenden Befehl aus.

    az policy definition create \
      --name $POLICY_DEFINITION \
      --mode All \
      --rules rules.json \
      --params param-defs.json
    
  2. Führen Sie den folgenden Befehl aus, um die Richtlinienzuweisung zu erstellen.

     az policy assignment create \
       --name $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
    

Erstellen Sie den Cluster.

Befolgen Sie die Anweisungen zum Erstellen eines Clusters. Schließen Sie in Ihrem Bereitstellungsbefehl az aro createden Parameter --cluster-resource-group $MANAGED_RESOURCE_GROUPein. Der Befehl sollte wie im folgenden Beispiel aussehen.

az aro create \
  --resource-group $RESOURCEGROUP \
  --name $CLUSTER \
  --vnet $VIRTUALNETWORK \
  --master-subnet master-subnet \
  --worker-subnet worker-subnet \
  --version <x.y.z> \
  --cluster-resource-group $MANAGED_RESOURCE_GROUP

Die Richtlinie wendet keine Tags auf Ressourcen in der Clusterressourcengruppe an. Tags werden nur auf die Ressourcen in der verwalteten Ressourcengruppe angewendet, in diesem Beispiel demoMRG.

Korrigieren von Tags mit Azure Policy

Sie können mithilfe eines Azure Policy-Wartungstasks zuvor zugewiesene Tags korrigieren und neue Tags hinzufügen. Die demoMRG verwaltete Ressourcengruppe und die zugehörigen Ressourcen weisen das Tag demoKey: demoResourceTagauf.

Öffnen Sie die Datei param-values.json , und ändern Sie vorhandene Parameterwerte, und fügen Sie im folgenden Beispiel neue Parameterwerte hinzu.

{
  "tag0": {
    "value": {
      "tag": [
        "demoKeyUpdate",
        "demoResourceGroupTagUpdate"
      ]
    }
  },
  "tag1": {
    "value": {
      "tag": [
        "demoKeyTag1",
        "demoResourceGroupTag1"
      ]
    }
  },
  "resourceGroupName": {
    "value": "demoMRG"
  }
}

Wenn Sie die Befehle ausführen, um die Parameterwerte zu aktualisieren und den Wartungsvorgang auszuführen, wendet die Richtlinie die Tags auf Ressourcen in der Verwalteten Ressourcengruppe an.

  1. Führen Sie den folgenden Befehl aus, um die Parameterwerte der Richtlinienzuweisung zu aktualisieren.

    az policy assignment update \
      --name $POLICY_ASSIGNMENT \
      --params param-values.json
    
  2. Starten Sie die Behebungsaufgabe.

    az policy remediation create \
      --name demoRemediation \
      --resource-group $MANAGED_RESOURCE_GROUP \
      --policy-assignment $POLICY_ASSIGNMENT
    

    Ermöglichen Sie die Ausführung des Wartungstasks, und beobachten Sie die Tags, die in der verwalteten Ressourcengruppe und den zugehörigen Ressourcen aktualisiert werden. Eine Remedierungsaufgabe entfernt keine Tags aus Ressourcen, sondern fügt nur Tags hinzu oder aktualisiert sie.

Nächste Schritte