Resourcegroepimplementaties met ARM-sjablonen

In dit artikel wordt beschreven hoe u het bereik van uw implementatie op een resourcegroep kunt toepassen. U gebruikt een Arm-sjabloon (Azure Resource Manager) voor de implementatie. In het artikel wordt ook beschreven hoe u het bereik buiten de resourcegroep kunt uitbreiden in de implementatiebewerking.

Tip

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

Ondersteunde resources

De meeste resources kunnen worden geïmplementeerd in een resourcegroep. Zie naslaginformatie over ARM-sjablonen voor een lijst met beschikbare resources.

Schema

Gebruik voor sjablonen het volgende schema:

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

Gebruik voor parameterbestanden:

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

Implementatieopdrachten

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

Gebruik az deployment group create voor Azure CLI. In het volgende voorbeeld wordt een sjabloon geïmplementeerd om een resourcegroep te maken. De resourcegroep die u opgeeft in de --resource-group parameter is de doelresourcegroep.

az deployment group create \
  --name demoRGDeployment \
  --resource-group ExampleGroup \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json" \
  --parameters storageAccountType=Standard_GRS

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

Implementatiebereiken

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

  • de doelresourcegroep van de bewerking
  • andere resourcegroepen in hetzelfde abonnement of andere abonnementen
  • een abonnement in de tenant
  • de tenant voor de resourcegroep

Een extensieresource kan worden gericht op een doel dat verschilt van 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 voor doelresourcegroep

Als u resources wilt implementeren in de doelresource, voegt u deze resources toe aan de sectie resources van de sjabloon.

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

Zie Implementeren naar doelresourcegroep voor een voorbeeldsjabloon.

Bereik naar resourcegroep in hetzelfde abonnement

Als u resources wilt implementeren in een andere resourcegroep in hetzelfde abonnement, voegt u een geneste implementatie toe en neemt u de resourceGroup eigenschap op. Als u de abonnements-id of resourcegroep niet opgeeft, worden het abonnement en de resourcegroep uit de bovenliggende sjabloon gebruikt. Alle resourcegroepen moeten bestaan voordat de implementatie wordt uitgevoerd.

In het volgende voorbeeld is de geneste implementatie gericht op een resourcegroep met de naam demoResourceGroup.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedDeployment",
      "resourceGroup": "demoResourceGroup",
      "properties": {
        "mode": "Incremental",
        "template": {
          resource-group-resources
        }
      }
    }
  ],
  "outputs": {}
}

Zie Implementeren in meerdere resourcegroepen voor een voorbeeldsjabloon.

Bereik voor resourcegroep in een ander abonnement

Als u resources wilt implementeren in een resourcegroep in een ander abonnement, voegt u een geneste implementatie toe en neemt u de subscriptionId eigenschappen en resourceGroup op. In het volgende voorbeeld is de geneste implementatie gericht op een resourcegroep met de naam demoResourceGroup.

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

Zie Implementeren in meerdere resourcegroepen voor een voorbeeldsjabloon.

Bereik voor abonnement

Als u resources wilt implementeren in een abonnement, voegt u een geneste implementatie toe en neemt u de subscriptionId eigenschap op. Het abonnement kan het abonnement voor de doelresourcegroep of een ander abonnement in de tenant zijn. Stel ook de location eigenschap in voor de geneste implementatie.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedDeployment",
      "location": "centralus",
      "subscriptionId": "0000000-0000-0000-0000-000000000000",
      "properties": {
        "mode": "Incremental",
        "template": {
          subscription-resources
        }
      }
    }
  ],
  "outputs": {}
}

Zie Resourcegroep maken voor een voorbeeldsjabloon.

Bereik naar 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 in scopelocation.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-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.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.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')]"
    }
  }
}

Zie Beheergroep voor meer informatie.

Implementeren naar doelresourcegroep

Als u resources in de doelresourcegroep wilt implementeren, definieert u deze resources in de resources sectie van de sjabloon. Met de volgende sjabloon maakt u een opslagaccount in de resourcegroep die is opgegeven in de implementatiebewerking.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storagePrefix": {
      "type": "string",
      "minLength": 3,
      "maxLength": 11
    },
    "storageSKU": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_RAGRS",
        "Standard_ZRS",
        "Premium_LRS",
        "Premium_ZRS",
        "Standard_GZRS",
        "Standard_RAGZRS"
      ]
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "variables": {
    "uniqueStorageName": "[concat(parameters('storagePrefix'), uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-09-01",
      "name": "[variables('uniqueStorageName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageSKU')]"
      },
      "kind": "StorageV2",
      "properties": {
        "supportsHttpsTrafficOnly": true
      }
    }
  ],
  "outputs": {
    "storageEndpoint": {
      "type": "object",
      "value": "[reference(variables('uniqueStorageName')).primaryEndpoints]"
    }
  }
}

Implementeren in meerdere resourcegroepen

U kunt implementeren in meer dan één resourcegroep in één ARM-sjabloon. Als u zich wilt richten op een resourcegroep die verschilt van de resourcegroep voor de bovenliggende sjabloon, gebruikt u een geneste of gekoppelde sjabloon. Geef in het implementatieresourcetype waarden op voor de abonnements-id en resourcegroep waarin u de geneste sjabloon wilt implementeren. De resourcegroepen kunnen in verschillende abonnementen bestaan.

Notitie

U kunt implementeren in 800 resourcegroepen in één implementatie. Deze beperking betekent doorgaans dat u kunt implementeren in één resourcegroep die is opgegeven voor de bovenliggende sjabloon en maximaal 799 resourcegroepen in geneste of gekoppelde implementaties. Als uw bovenliggende sjabloon echter alleen geneste of gekoppelde sjablonen bevat en zelf geen resources implementeert, kunt u maximaal 800 resourcegroepen opnemen in geneste of gekoppelde implementaties.

In het volgende voorbeeld worden twee opslagaccounts geïmplementeerd. Het eerste opslagaccount wordt geïmplementeerd in de resourcegroep die is opgegeven in de implementatiebewerking. Het tweede opslagaccount wordt geïmplementeerd in de resourcegroep die is opgegeven in de secondResourceGroup parameters en secondSubscriptionID :

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storagePrefix": {
      "type": "string",
      "maxLength": 11
    },
    "secondResourceGroup": {
      "type": "string"
    },
    "secondSubscriptionID": {
      "type": "string",
      "defaultValue": ""
    },
    "secondStorageLocation": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "variables": {
    "firstStorageName": "[concat(parameters('storagePrefix'), uniqueString(resourceGroup().id))]",
    "secondStorageName": "[concat(parameters('storagePrefix'), uniqueString(parameters('secondSubscriptionID'), parameters('secondResourceGroup')))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-04-01",
      "name": "[variables('firstStorageName')]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedTemplate",
      "resourceGroup": "[parameters('secondResourceGroup')]",
      "subscriptionId": "[parameters('secondSubscriptionID')]",
      "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.Storage/storageAccounts",
              "apiVersion": "2021-04-01",
              "name": "[variables('secondStorageName')]",
              "location": "[parameters('secondStorageLocation')]",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "Storage",
              "properties": {
              }
            }
          ]
        },
        "parameters": {}
      }
    }
  ]
}

Als u de resourceGroup naam instelt van een resourcegroep die niet bestaat, mislukt de implementatie.

Als u de voorgaande sjabloon wilt testen en de resultaten wilt bekijken, gebruikt u PowerShell of Azure CLI.

Als u twee opslagaccounts wilt implementeren in twee resourcegroepen in hetzelfde abonnement, gebruikt u:

firstRG="primarygroup"
secondRG="secondarygroup"

az group create --name $firstRG --location southcentralus
az group create --name $secondRG --location eastus
az deployment group create \
  --name ExampleDeployment \
  --resource-group $firstRG \
  --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crosssubscription.json \
  --parameters storagePrefix=tfstorage secondResourceGroup=$secondRG secondStorageLocation=eastus

Als u twee opslagaccounts wilt implementeren in twee abonnementen, gebruikt u:

firstRG="primarygroup"
secondRG="secondarygroup"

firstSub="<first-subscription-id>"
secondSub="<second-subscription-id>"

az account set --subscription $secondSub
az group create --name $secondRG --location eastus

az account set --subscription $firstSub
az group create --name $firstRG --location southcentralus

az deployment group create \
  --name ExampleDeployment \
  --resource-group $firstRG \
  --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crosssubscription.json \
  --parameters storagePrefix=storage secondResourceGroup=$secondRG secondStorageLocation=eastus secondSubscriptionID=$secondSub

Een resourcegroep maken

Vanuit een resourcegroepimplementatie kunt u overschakelen naar het niveau van een abonnement en een resourcegroep maken. Met de volgende sjabloon wordt een opslagaccount geïmplementeerd in de doelresourcegroep en wordt een nieuwe resourcegroep gemaakt in het opgegeven abonnement.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storagePrefix": {
      "type": "string",
      "maxLength": 11
    },
    "newResourceGroupName": {
      "type": "string"
    },
    "nestedSubscriptionID": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "variables": {
    "storageName": "[concat(parameters('storagePrefix'), uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-04-01",
      "name": "[variables('storageName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "demoSubDeployment",
      "location": "westus",
      "subscriptionId": "[parameters('nestedSubscriptionID')]",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Resources/resourceGroups",
              "apiVersion": "2021-04-01",
              "name": "[parameters('newResourceGroupName')]",
              "location": "[parameters('location')]",
              "properties": {}
            }
          ],
          "outputs": {}
        }
      }
    }
  ]
}

Volgende stappen