Distribuire le risorse di Azure in più gruppi di sottoscrizioni e risorseDeploy Azure resources to more than one subscription or resource group

In genere si distribuiscono tutte le risorse del modello in un unico gruppo di risorse.Typically, you deploy all the resources in your template to a single resource group. ma in alcuni scenari può essere preferibile distribuire insieme un set di risorse, inserendole tuttavia in gruppi di sottoscrizioni e risorse diversi.However, there are scenarios where you want to deploy a set of resources together but place them in different resource groups or subscriptions. Potrebbe essere necessario, ad esempio, distribuire la macchina virtuale di backup per Azure Site Recovery in un gruppo di risorse e in una posizione separati.For example, you may want to deploy the backup virtual machine for Azure Site Recovery to a separate resource group and location. Resource Manager consente di usare modelli annidati per specificare come destinazione gruppi di sottoscrizioni e risorse diversi da quello usato per il modello padre.Resource Manager enables you to use nested templates to target different subscriptions and resource groups than the subscription and resource group used for the parent template.

Nota

Un'unica distribuzione può interessare solo cinque gruppi di risorse.You can deploy to only five resource groups in a single deployment. 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 quattro gruppi di risorse nelle distribuzioni annidate o collegate.Typically, this limitation means you can deploy to one resource group specified for the parent template, and up to four resource groups in nested or linked deployments. Tuttavia, se il modello padre contiene solo modelli annidati o collegati e non distribuisce risorse, è possibile includere fino a cinque gruppi di risorse nelle distribuzioni annidate o collegate.However, if your parent template contains only nested or linked templates and does not itself deploy any resources, then you can include up to five resource groups in nested or linked deployments.

Specificare un gruppo di sottoscrizioni e risorseSpecify a subscription and resource group

Per specificare come destinazione una risorsa diversa, usare un modello annidato o collegato.To target a different resource, use a nested or linked template. Il tipo di risorsa Microsoft.Resources/deployments fornisce parametri per subscriptionId e resourceGroup.The Microsoft.Resources/deployments resource type provides parameters for subscriptionId and resourceGroup. Queste proprietà consentono di specificare un gruppo di sottoscrizioni e risorse diverso per la distribuzione nidificata.These properties enable you to specify a different subscription and resource group for the nested deployment. Tutti i gruppi di risorse devono esistere prima di eseguire la distribuzione.All the resource groups must exist before running the deployment. Se non si specifica un ID sottoscrizione o un gruppo di risorse, viene usato il gruppo di sottoscrizioni e risorse del modello padre.If you do not specify either the subscription ID or resource group, the subscription and resource group from the parent template is used.

L'account usato per distribuire il modello deve disporre delle autorizzazioni per la distribuzione per l'ID sottoscrizione specificato.The account you use to deploy the template must have permissions to deploy to the specified subscription ID. Se la sottoscrizione specificata è presente in un tenant di Azure Active Directory diverso, è necessario aggiungere gli utenti guest da un'altra directory.If the specified subscription exists in a different Azure Active Directory tenant, you must add guest users from another directory.

Per specificare un gruppo di risorse e una sottoscrizione differenti, usare:To specify a different resource group and subscription, use:

"resources": [
    {
        "apiVersion": "2017-05-10",
        "name": "nestedTemplate",
        "type": "Microsoft.Resources/deployments",
        "resourceGroup": "[parameters('secondResourceGroup')]",
        "subscriptionId": "[parameters('secondSubscriptionID')]",
        ...
    }
]

Se i gruppi di risorse si trovano nella stessa sottoscrizione, è possibile rimuovere il valore subscriptionId.If your resource groups are in the same subscription, you can remove the subscriptionId value.

L'esempio seguente distribuisce due account di archiviazione, uno nel gruppo di risorse specificato durante la distribuzione e uno in un gruppo di risorse specificato nel parametro secondResourceGroup:The following example deploys two storage accounts - one in the resource group specified during deployment, and one in a resource group specified in the secondResourceGroup parameter:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-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": [
        {
            "apiVersion": "2017-05-10",
            "name": "nestedTemplate",
            "type": "Microsoft.Resources/deployments",
            "resourceGroup": "[parameters('secondResourceGroup')]",
            "subscriptionId": "[parameters('secondSubscriptionID')]",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "type": "Microsoft.Storage/storageAccounts",
                            "name": "[variables('secondStorageName')]",
                            "apiVersion": "2017-06-01",
                            "location": "[parameters('secondStorageLocation')]",
                            "sku":{
                                "name": "Standard_LRS"
                            },
                            "kind": "Storage",
                            "properties": {
                            }
                        }
                    ]
                },
                "parameters": {}
            }
        },
        {
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('firstStorageName')]",
            "apiVersion": "2017-06-01",
            "location": "[resourceGroup().location]",
            "sku":{
                "name": "Standard_LRS"
            },
            "kind": "Storage",
            "properties": {
            }
        }
    ]
}

Se si imposta resourceGroup sul nome di un gruppo di risorse che non esiste, la distribuzione ha esito negativo.If you set resourceGroup to the name of a resource group that does not exist, the deployment fails.

Per distribuire il modello di esempio, usare Azure PowerShell 4.0.0 o versione successiva o l'interfaccia della riga di comando di Azure 2.0.0 o versione successiva.To deploy the example template, use Azure PowerShell 4.0.0 or later, or Azure CLI 2.0.0 or later.

Usare le funzioni resourceGroup() e subscription()Use the resourceGroup() and subscription() functions

Per le distribuzioni tra gruppi di risorse, le funzioni resourceGroup() e subscription() vengono risolte in modo diverso in base al modo in cui si specifica il modello annidato.For cross resource group deployments, the resourceGroup() and subscription() functions resolve differently based on how you specify the nested template.

Se si incorpora un modello in un altro modello, le funzioni nel modello annidato si risolvono nel gruppo di risorse e nella sottoscrizione padre.If you embed one template within another template, the functions in the nested template resolve to the parent resource group and subscription. Un modello incorporato usa il formato seguente:An embedded template uses the following format:

"apiVersion": "2017-05-10",
"name": "embeddedTemplate",
"type": "Microsoft.Resources/deployments",
"resourceGroup": "crossResourceGroupDeployment",
"properties": {
    "mode": "Incremental",
    "template": {
        ...
        resourceGroup() and subscription() refer to parent resource group/subscription
    }
}

Se si crea un collegamento a un modello separato, le funzioni nel modello collegato si risolvono nel gruppo di risorse e nella sottoscrizione annidati.If you link to a separate template, the functions in the linked template resolve to the nested resource group and subscription. Un modello collegato usa il formato seguente:A linked template uses the following format:

"apiVersion": "2017-05-10",
"name": "linkedTemplate",
"type": "Microsoft.Resources/deployments",
"resourceGroup": "crossResourceGroupDeployment",
"properties": {
    "mode": "Incremental",
    "templateLink": {
        ...
        resourceGroup() and subscription() in linked template refer to linked resource group/subscription
    }
}

Modelli di esempioExample templates

I modelli seguenti mostrano distribuzioni tra più gruppi di risorse.The following templates demonstrate multiple resource group deployments. Dopo la tabella sono mostrati script per distribuire i modelli.Scripts to deploy the templates are shown after the table.

ModelloTemplate DESCRIZIONEDescription
Modello tra più sottoscrizioniCross subscription template Distribuisce un account di archiviazione in un gruppo di risorse e un account di archiviazione in un secondo gruppo di risorse.Deploys one storage account to one resource group and one storage account to a second resource group. Includere un valore per l'ID sottoscrizione quando il secondo gruppo di risorse è in una sottoscrizione diversa.Include a value for the subscription ID when the second resource group is in a different subscription.
Modello di proprietà a più gruppi di risorseCross resource group properties template Mostra in che modo si risolve la funzione resourceGroup().Demonstrates how the resourceGroup() function resolves. Non distribuisce alcuna risorsa.It does not deploy any resources.

PowerShellPowerShell

Per PowerShell, per distribuire due account di archiviazione in due gruppi di risorse nella stessa sottoscrizione, usare:For PowerShell, to deploy two storage accounts to two resource groups in the same subscription, use:

$firstRG = "primarygroup"
$secondRG = "secondarygroup"

New-AzureRmResourceGroup -Name $firstRG -Location southcentralus
New-AzureRmResourceGroup -Name $secondRG -Location eastus

New-AzureRmResourceGroupDeployment `
  -ResourceGroupName $firstRG `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crosssubscription.json `
  -storagePrefix storage `
  -secondResourceGroup $secondRG `
  -secondStorageLocation eastus

Per PowerShell, per distribuire due account di archiviazione in due sottoscrizioni, usare:For PowerShell, to deploy two storage accounts to two subscriptions, use:

$firstRG = "primarygroup"
$secondRG = "secondarygroup"

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

Select-AzureRmSubscription -Subscription $secondSub
New-AzureRmResourceGroup -Name $secondRG -Location eastus

Select-AzureRmSubscription -Subscription $firstSub
New-AzureRmResourceGroup -Name $firstRG -Location southcentralus

New-AzureRmResourceGroupDeployment `
  -ResourceGroupName $firstRG `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crosssubscription.json `
  -storagePrefix storage `
  -secondResourceGroup $secondRG `
  -secondStorageLocation eastus `
  -secondSubscriptionID $secondSub

Per PowerShell, per testare in che modo l'oggetto gruppo di risorse si risolve per il modello padre, modello inline e modello collegato, usare:For PowerShell, to test how the resource group object resolves for the parent template, inline template, and linked template, use:

New-AzureRmResourceGroup -Name parentGroup -Location southcentralus
New-AzureRmResourceGroup -Name inlineGroup -Location southcentralus
New-AzureRmResourceGroup -Name linkedGroup -Location southcentralus

New-AzureRmResourceGroupDeployment `
  -ResourceGroupName parentGroup `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crossresourcegroupproperties.json

Nell'esempio precedente, sia parentRG che inlineRG vengono risolti in parentGroup.In the preceding example, both parentRG and inlineRG resolve to parentGroup. linkedRG viene risolto in linkedGroup.linkedRG resolves to linkedGroup. L'output dell'esempio precedente è:The output from the preceding example is:

 Name             Type                       Value
 ===============  =========================  ==========
 parentRG         Object                     {
                                               "id": "/subscriptions/<subscription-id>/resourceGroups/parentGroup",
                                               "name": "parentGroup",
                                               "location": "southcentralus",
                                               "properties": {
                                                 "provisioningState": "Succeeded"
                                               }
                                             }
 inlineRG         Object                     {
                                               "id": "/subscriptions/<subscription-id>/resourceGroups/parentGroup",
                                               "name": "parentGroup",
                                               "location": "southcentralus",
                                               "properties": {
                                                 "provisioningState": "Succeeded"
                                               }
                                             }
 linkedRG         Object                     {
                                               "id": "/subscriptions/<subscription-id>/resourceGroups/linkedGroup",
                                               "name": "linkedGroup",
                                               "location": "southcentralus",
                                               "properties": {
                                                 "provisioningState": "Succeeded"
                                               }
                                             }

Interfaccia della riga di comando di AzureAzure CLI

Per l'interfaccia della riga di comando di Azure, per distribuire due account di archiviazione in due gruppi di risorse nella stessa sottoscrizione, usare:For Azure CLI, to deploy two storage accounts to two resource groups in the same subscription, use:

firstRG="primarygroup"
secondRG="secondarygroup"

az group create --name $firstRG --location southcentralus
az group create --name $secondRG --location eastus
az group deployment 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 l'interfaccia della riga di comando di Azure, per distribuire due account di archiviazione in due sottoscrizioni, usare:For Azure CLI, to deploy two storage accounts to two subscriptions, use:

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 group deployment 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

Per l'interfaccia della riga di comando di Azure, per testare in che modo l'oggetto gruppo di risorse si risolve per il modello padre, modello inline e modello collegato, usare:For Azure CLI, to test how the resource group object resolves for the parent template, inline template, and linked template, use:

az group create --name parentGroup --location southcentralus
az group create --name inlineGroup --location southcentralus
az group create --name linkedGroup --location southcentralus

az group deployment create \
  --name ExampleDeployment \
  --resource-group parentGroup \
  --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crossresourcegroupproperties.json 

Nell'esempio precedente, sia parentRG che inlineRG vengono risolti in parentGroup.In the preceding example, both parentRG and inlineRG resolve to parentGroup. linkedRG viene risolto in linkedGroup.linkedRG resolves to linkedGroup. L'output dell'esempio precedente è:The output from the preceding example is:

...
"outputs": {
  "inlineRG": {
    "type": "Object",
    "value": {
      "id": "/subscriptions/<subscription-id>/resourceGroups/parentGroup",
      "location": "southcentralus",
      "name": "parentGroup",
      "properties": {
        "provisioningState": "Succeeded"
      }
    }
  },
  "linkedRG": {
    "type": "Object",
    "value": {
      "id": "/subscriptions/<subscription-id>/resourceGroups/linkedGroup",
      "location": "southcentralus",
      "name": "linkedGroup",
      "properties": {
        "provisioningState": "Succeeded"
      }
    }
  },
  "parentRG": {
    "type": "Object",
    "value": {
      "id": "/subscriptions/<subscription-id>/resourceGroups/parentGroup",
      "location": "southcentralus",
      "name": "parentGroup",
      "properties": {
        "provisioningState": "Succeeded"
      }
    }
  }
},
...

Passaggi successiviNext steps