Implementaties van beheergroepen met ARM-sjablonen

Naarmate uw organisatie volwassener wordt, kunt u een Azure Resource Manager-sjabloon (ARM-sjabloon) implementeren om resources te maken op het niveau van de beheergroep. Mogelijk moet u bijvoorbeeld beleidsregels of op rollen gebaseerd toegangsbeheer van Azure (Azure RBAC) definiëren en toewijzen voor een beheergroep. Met sjablonen op beheergroepsniveau kunt u declaratief beleid toepassen en rollen toewijzen op het niveau van de beheergroep.

Tip

We raden Bicep aan omdat het dezelfde mogelijkheden biedt als ARM-sjablonen en de syntaxis eenvoudiger te gebruiken is. Zie implementaties van beheergroepen voor meer informatie.

Ondersteunde resources

Niet alle resourcetypen kunnen worden geïmplementeerd op het niveau van de beheergroep. In deze sectie wordt vermeld welke resourcetypen worden ondersteund.

Gebruik voor Azure Blueprints:

Gebruik voor Azure Policy:

Gebruik voor toegangsbeheer:

Voor geneste sjablonen die worden geïmplementeerd in abonnementen of resourcegroepen, gebruikt u:

Voor het beheren van uw resources gebruikt u:

Beheergroepen zijn resources op tenantniveau. U kunt echter beheergroepen maken in een beheergroepimplementatie door het bereik van de nieuwe beheergroep in te stellen op de tenant. Zie Beheergroep.

Schema

Het schema dat u gebruikt voor beheergroepimplementaties is anders dan het schema voor resourcegroepimplementaties.

Gebruik voor sjablonen:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  ...
}

Het schema voor een parameterbestand is hetzelfde voor alle implementatiebereiken. Gebruik voor parameterbestanden:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  ...
}

Implementatieopdrachten

Als u wilt implementeren in een beheergroep, gebruikt u de implementatieopdrachten van de beheergroep.

Gebruik az deployment mg create voor Azure CLI:

az deployment mg create \
  --name demoMGDeployment \
  --location WestUS \
  --management-group-id myMG \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/management-level-deployment/azuredeploy.json"

Zie voor meer gedetailleerde informatie over implementatieopdrachten en opties voor het implementeren van ARM-sjablonen:

Implementatielocatie en -naam

Voor implementaties op beheergroepsniveau moet u een locatie voor de implementatie opgeven. De locatie van de implementatie staat los van de locatie van de resources die u implementeert. De implementatielocatie geeft aan waar implementatiegegevens moeten worden opgeslagen. Voor abonnements- en tenantimplementaties is ook een locatie vereist. Voor resourcegroepimplementaties wordt de locatie van de resourcegroep gebruikt om de implementatiegegevens op te slaan.

U kunt een naam opgeven voor de implementatie of de standaardimplementatienaam gebruiken. De standaardnaam is de naam van het sjabloonbestand. Als u bijvoorbeeld een sjabloon met de naam azuredeploy.json implementeert, wordt de standaardimplementatienaam azuredeploy gemaakt.

Voor elke implementatienaam is de locatie onveranderbaar. U kunt geen implementatie op één locatie maken wanneer er een bestaande implementatie met dezelfde naam op een andere locatie is. Als u bijvoorbeeld een beheergroepimplementatie maakt met de naam deployment1 in centralus, kunt u later geen andere implementatie maken met de naam deployment1 , maar een locatie van westus. Als u de foutcode InvalidDeploymentLocationkrijgt, gebruikt u een andere naam of dezelfde locatie als de vorige implementatie voor die naam.

Implementatiebereiken

Wanneer u implementeert in een beheergroep, kunt u resources implementeren voor:

  • de doelbeheergroep van de bewerking
  • een andere beheergroep in de tenant
  • abonnementen in de beheergroep
  • resourcegroepen in de beheergroep
  • de tenant voor de resourcegroep

Een extensieresource kan worden ingesteld op een ander doel dan het implementatiedoel.

De gebruiker die de sjabloon implementeert, moet toegang hebben tot het opgegeven bereik.

In deze sectie wordt beschreven hoe u verschillende bereiken opgeeft. U kunt deze verschillende bereiken combineren in één sjabloon.

Bereik naar doelbeheergroep

Resources die zijn gedefinieerd in de sectie resources van de sjabloon, worden vanuit de implementatieopdracht toegepast op de beheergroep.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    management-group-resources-default
  ],
  "outputs": {}
}

Bereik naar een andere beheergroep

Als u zich op een andere beheergroep wilt richten, voegt u een geneste implementatie toe en geeft u de eigenschap op scope . Stel de scope eigenschap in op een waarde in de indeling Microsoft.Management/managementGroups/<mg-name>.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string"
    }
  },
  "variables": {
    "mgId": "[format('Microsoft.Management/managementGroups/{0}', parameters('mgName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedDeployment",
      "scope": "[variables('mgId')]",
      "location": "eastus",
      "properties": {
        "mode": "Incremental",
        "template": {
          management-group-resources-non-default
        }
      }
    }
  ],
  "outputs": {}
}

Bereik voor abonnement

U kunt zich ook richten op abonnementen binnen een beheergroep. De gebruiker die de sjabloon implementeert, moet toegang hebben tot het opgegeven bereik.

Als u een abonnement binnen de beheergroep wilt targeten, gebruikt u een geneste implementatie en de subscriptionId eigenschap.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedSub",
      "location": "westus2",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              subscription-resources
            }
          ]
        }
      }
    }
  ]
}

Bereik naar resourcegroep

U kunt zich ook richten op resourcegroepen binnen de beheergroep. De gebruiker die de sjabloon implementeert, moet toegang hebben tot het opgegeven bereik.

Als u een resourcegroep binnen de beheergroep wilt targeten, gebruikt u een geneste implementatie. Stel de subscriptionId eigenschappen en resourceGroup in. Stel geen locatie in voor de geneste implementatie, omdat deze wordt geïmplementeerd op de locatie van de resourcegroep.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedRGDeploy",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "resourceGroup": "demoResourceGroup",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              resource-group-resources
            }
          ]
        }
      }
    }
  ]
}

Zie Implementeren in abonnement en resourcegroep als u een implementatie van een beheergroep wilt gebruiken voor het maken van een resourcegroep binnen een abonnement en het implementeren van een opslagaccount in die resourcegroep.

Bereik voor tenant

Als u resources in de tenant wilt maken, stelt u de scope in op /. De gebruiker die de sjabloon implementeert, moet de vereiste toegang hebben om te implementeren in de tenant.

Als u een geneste implementatie wilt gebruiken, stelt u en locationinscope.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedDeployment",
      "location": "centralus",
      "scope": "/",
      "properties": {
        "mode": "Incremental",
        "template": {
          tenant-resources
        }
      }
    }
  ],
  "outputs": {}
}

U kunt het bereik / ook instellen op voor bepaalde resourcetypen, zoals beheergroepen. Het maken van een nieuwe beheergroep wordt beschreven in de volgende sectie.

Beheergroep

Als u een beheergroep wilt maken in een beheergroepimplementatie, moet u het bereik / instellen op voor de beheergroep.

In het volgende voorbeeld wordt een nieuwe beheergroep gemaakt in de hoofdbeheergroep.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string",
      "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Management/managementGroups",
      "apiVersion": "2021-04-01",
      "name": "[parameters('mgName')]",
      "scope": "/",
      "location": "eastus",
      "properties": {}
    }
  ],
  "outputs": {
    "output": {
      "type": "string",
      "value": "[parameters('mgName')]"
    }
  }
}

In het volgende voorbeeld wordt een nieuwe beheergroep gemaakt in de beheergroep die is opgegeven als de bovenliggende groep. U ziet dat het bereik is ingesteld op /.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string",
      "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
    },
    "parentMG": {
      "type": "string"
    }
  },
  "resources": [
    {
      "name": "[parameters('mgName')]",
      "type": "Microsoft.Management/managementGroups",
      "apiVersion": "2021-04-01",
      "scope": "/",
      "location": "eastus",
      "properties": {
        "details": {
          "parent": {
            "id": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('parentMG'))]"
          }
        }
      }
    }
  ],
  "outputs": {
    "output": {
      "type": "string",
      "value": "[parameters('mgName')]"
    }
  }
}

Abonnementen

Als u een ARM-sjabloon wilt gebruiken om een nieuw Azure-abonnement in een beheergroep te maken, raadpleegt u:

Als u een sjabloon wilt implementeren waarmee een bestaand Azure-abonnement naar een nieuwe beheergroep wordt verplaatst, raadpleegt u Abonnementen verplaatsen in ARM-sjabloon

Azure Policy

Aangepaste beleidsdefinities die in de beheergroep worden geïmplementeerd, zijn uitbreidingen van de beheergroep. Als u de id van een aangepaste beleidsdefinitie wilt ophalen, gebruikt u de functie extensionResourceId(). Ingebouwde beleidsdefinities zijn resources op tenantniveau. Gebruik de functie tenantResourceId() om de id van een ingebouwde beleidsdefinitie op te halen.

In het volgende voorbeeld ziet u hoe u een beleid definieert op het niveau van de beheergroep en hoe u dit toewijst.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "targetMG": {
      "type": "string",
      "metadata": {
        "description": "Target Management Group"
      }
    },
    "allowedLocations": {
      "type": "array",
      "defaultValue": [
        "australiaeast",
        "australiasoutheast",
        "australiacentral"
      ],
      "metadata": {
        "description": "An array of the allowed locations, all other locations will be denied by the created policy."
      }
    }
  },
  "variables": {
    "mgScope": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('targetMG'))]",
    "policyDefinition": "LocationRestriction"
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/policyDefinitions",
      "name": "[variables('policyDefinition')]",
      "apiVersion": "2020-09-01",
      "properties": {
        "policyType": "Custom",
        "mode": "All",
        "parameters": {
        },
        "policyRule": {
          "if": {
            "not": {
              "field": "location",
              "in": "[parameters('allowedLocations')]"
            }
          },
          "then": {
            "effect": "deny"
          }
        }
      }
    },
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "name": "location-lock",
      "apiVersion": "2020-09-01",
      "dependsOn": [
        "[variables('policyDefinition')]"
      ],
      "properties": {
        "scope": "[variables('mgScope')]",
        "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', variables('policyDefinition'))]"
      }
    }
  ]
}

Implementeren naar abonnement en resourcegroep

Vanuit een implementatie op beheergroepniveau kunt u een abonnement binnen de beheergroep als doel hebben. In het volgende voorbeeld wordt een resourcegroep binnen een abonnement gemaakt en wordt een opslagaccount geïmplementeerd in die resourcegroep.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "nestedsubId": {
      "type": "string"
    },
    "nestedRG": {
      "type": "string"
    },
    "storageAccountName": {
      "type": "string"
    },
    "nestedLocation": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedSub",
      "location": "[parameters('nestedLocation')]",
      "subscriptionId": "[parameters('nestedSubId')]",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
          },
          "variables": {
          },
          "resources": [
            {
              "type": "Microsoft.Resources/resourceGroups",
              "apiVersion": "2021-04-01",
              "name": "[parameters('nestedRG')]",
              "location": "[parameters('nestedLocation')]"
            }
          ]
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedRG",
      "subscriptionId": "[parameters('nestedSubId')]",
      "resourceGroup": "[parameters('nestedRG')]",
      "dependsOn": [
        "nestedSub"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2021-04-01",
              "name": "[parameters('storageAccountName')]",
              "location": "[parameters('nestedLocation')]",
              "kind": "StorageV2",
              "sku": {
                "name": "Standard_LRS"
              }
            }
          ]
        }
      }
    }
  ]
}

Volgende stappen