Condividi tramite


Distribuzioni di gruppi di risorse con modelli ARM

Questo articolo descrive come definire l'ambito della distribuzione in un gruppo di risorse. Si usa un modello di Azure Resource Manager per la distribuzione. L'articolo illustra anche come espandere l'ambito oltre il gruppo di risorse nell'operazione di distribuzione.

Suggerimento

È consigliabile usare Bicep perché offre le stesse funzionalità dei modelli arm e la sintassi è più facile da usare. Per altre informazioni, vedere Distribuzioni di gruppi di risorse.

Risorse supportate

La maggior parte delle risorse può essere distribuita in un gruppo di risorse. Per un elenco delle risorse disponibili, vedere riferimento al modello ARM.

Diagramma

Per i modelli, usare lo schema seguente:

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

Per i file di parametri, usare:

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

Comandi di distribuzione

Per eseguire la distribuzione in un gruppo di risorse, usare i comandi di distribuzione del gruppo di risorse.

Per l'interfaccia della riga di comando di Azure, usare az deployment group create. L'esempio seguente distribuisce un modello per creare un gruppo di risorse. Il gruppo di risorse specificato nel --resource-group parametro è il gruppo di risorse di destinazione.

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

Per informazioni più dettagliate sui comandi e sulle opzioni di distribuzione per la distribuzione di modelli di ARM, vedi:

Ambiti di distribuzione

Quando si esegue la distribuzione in un gruppo di risorse, è possibile distribuire le risorse in:

  • il gruppo di risorse di destinazione dall'operazione
  • altri gruppi di risorse nella stessa sottoscrizione o in altre sottoscrizioni
  • qualsiasi sottoscrizione nel tenant
  • tenant per il gruppo di risorse

Le uniche transizioni di ambito non consentite vengono eseguite dal gruppo di risorse al gruppo di gestione o dalla sottoscrizione al gruppo di gestione.

È possibile definire l'ambito di una risorsa di estensione a una destinazione diversa dalla destinazione di distribuzione.

L'utente che distribuisce il modello deve avere accesso all’ambito specificato.

Questa sezione mostra come specificare ambiti diversi. Questi ambiti diversi possono essere combinati in un singolo modello.

Ambito del gruppo di risorse di destinazione

Per distribuire le risorse nella risorsa di destinazione, aggiungere tali risorse alla sezione resources del modello.

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

Per un modello di esempio, vedere Distribuire nel gruppo di risorse di destinazione.

Ambito del gruppo di risorse nella stessa sottoscrizione

Per distribuire le risorse in un gruppo di risorse diverso nella stessa sottoscrizione, aggiungere una distribuzione annidata e includere la resourceGroup proprietà . Se non si specifica l'ID abbonamento o il gruppo di risorse, vengono usati l'abbonamento e il gruppo di risorse del modello padre. Prima di eseguire la distribuzione, tutti i gruppi di risorse devono esistere.

Nell'esempio seguente, la distribuzione nidificata è destinata a un gruppo di risorse denominato 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": {}
}

Per un modello di esempio, vedere Distribuire in più gruppi di risorse.

Ambito del gruppo di risorse in una sottoscrizione diversa

Per distribuire le risorse in un gruppo di risorse in una sottoscrizione diversa, aggiungere una distribuzione annidata e includere le proprietà subscriptionId e resourceGroup. Nell'esempio seguente, la distribuzione nidificata è destinata a un gruppo di risorse denominato 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": {}
}

Per un modello di esempio, vedere Distribuire in più gruppi di risorse.

Ambito della sottoscrizione

Per distribuire le risorse in una sottoscrizione, aggiungere una distribuzione annidata e includere la subscriptionId proprietà . La sottoscrizione può essere quella per il gruppo di risorse target, o qualsiasi altra sottoscrizione nel tenant. Impostare anche la location proprietà per la distribuzione nidificata.

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

Per un modello di esempio, vedere Creare un gruppo di risorse.

Ambito del tenant

Per creare risorse nel tenant, imposta scope su /. L'utente che distribuisce il modello deve avere l'accesso necessario per la distribuzione nel tenant.

Per usare una distribuzione annidata, imposta scope e location.

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

In alternativa, puoi impostare l'ambito su / per alcuni tipi di risorse, ad esempio i gruppi di gestione.

{
  "$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')]"
    }
  }
}

Per altre informazioni, vedere Gruppo di gestione.

Distribuire nel gruppo di risorse di destinazione

Per distribuire le risorse nel gruppo di risorse di destinazione, definire tali risorse nella sezione resources del modello. Il modello seguente crea un account di archiviazione nel gruppo di risorse specificato nell'operazione di distribuzione.

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

Distribuire in più gruppi di risorse

È possibile eseguire la distribuzione in più di un gruppo di risorse in un singolo modello di Resource Manager. Per specificare come destinazione un gruppo di risorse diverso da quello per il modello padre, usare un modello annidato o collegato. All'interno del tipo di risorsa di distribuzione specificare i valori per l'ID sottoscrizione e il gruppo di risorse in cui si vuole distribuire il modello annidato. I gruppi di risorse possono esistere in sottoscrizioni diverse.

Annotazioni

È possibile distribuire in 800 gruppi di risorse in una singola distribuzione. Questa limitazione significa in genere che è possibile eseguire la distribuzione in un solo gruppo di risorse specificato per il modello padre e in un massimo di 799 gruppi di risorse nelle distribuzioni annidate o collegate. Tuttavia, se il modello padre contiene solo modelli annidati o collegati e non distribuisce alcuna risorsa, è possibile includere fino a 800 gruppi di risorse in distribuzioni annidate o collegate.

L'esempio seguente consente di distribuire due account di archiviazione. Il primo account di archiviazione viene distribuito nel gruppo di risorse specificato nell'operazione di distribuzione. Il secondo account di archiviazione viene distribuito nel gruppo di risorse specificato nei parametri secondResourceGroup e 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": {}
      }
    }
  ]
}

Se si imposta resourceGroup sul nome di un gruppo di risorse che non esiste, la distribuzione ha esito negativo.

Per testare il modello precedente e visualizzare i risultati, usare PowerShell o l'interfaccia della riga di comando di Azure.

Per distribuire due account di archiviazione in due gruppi di risorse nella stessa sottoscrizione, usare:

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

Per distribuire due account di archiviazione in due sottoscrizioni, usare:

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

Crea gruppo di risorse

Da una distribuzione di un gruppo di risorse, è possibile passare al livello di una sottoscrizione e creare un gruppo di risorse. Il modello seguente distribuisce un account di archiviazione nel gruppo di risorse di destinazione e crea un nuovo gruppo di risorse nella sottoscrizione specificata.

{
  "$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": {}
        }
      }
    }
  ]
}

Passaggi successivi