Implementación de recursos de Azure en más de un grupo de recursos o una suscripciónDeploy Azure resources to more than one subscription or resource group

Nota

Este artículo se ha actualizado para usar el nuevo módulo Az de Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Aún puede usar el módulo de AzureRM que continuará recibiendo correcciones de errores hasta diciembre de 2020 como mínimo.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Para más información acerca del nuevo módulo Az y la compatibilidad con AzureRM, consulte Introducing the new Azure PowerShell Az module (Presentación del nuevo módulo Az de Azure PowerShell).To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Para obtener instrucciones sobre la instalación del módulo Az, consulte Instalación de Azure PowerShell.For Az module installation instructions, see Install Azure PowerShell.

Por lo general, todos los recursos de la plantilla se implementan en un único grupo de recursos.Typically, you deploy all the resources in your template to a single resource group. Sin embargo, existen escenarios en los que desea implementar un conjunto de recursos juntos pero colocarlos en distintos grupos de recursos o suscripciones.However, there are scenarios where you want to deploy a set of resources together but place them in different resource groups or subscriptions. Por ejemplo, puede que desee implementar la máquina virtual de copia de seguridad para Azure Site Recovery en un grupo de recursos y una ubicación independientes.For example, you may want to deploy the backup virtual machine for Azure Site Recovery to a separate resource group and location. Resource Manager permite usar plantillas anidadas para tener como destino grupos de recursos y suscripciones diferentes a los usados para la plantilla principal.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

Cada implementación solo puede realizarse en cinco grupos de recursos.You can deploy to only five resource groups in a single deployment. Normalmente, esta limitación significa que puede implementar en un grupo de recursos especificado para la plantilla principal y hasta en cuatro grupos de recursos en implementaciones anidadas o vinculadas.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. Sin embargo, si la plantilla principal contiene solo plantillas anidadas o vinculadas y no implementa por sí misma ningún recurso, puede incluir hasta cinco grupos de recursos en las implementaciones anidadas o vinculadas.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.

Especificación de una suscripción y un grupo de recursosSpecify a subscription and resource group

Para usar como destino un recurso diferente, utilice una plantilla anidada o vinculada.To target a different resource, use a nested or linked template. El tipo de recurso Microsoft.Resources/deployments proporciona los parámetros para subscriptionId y resourceGroup.The Microsoft.Resources/deployments resource type provides parameters for subscriptionId and resourceGroup. Estas propiedades permiten especificar un grupo de recursos y suscripción diferentes para la implementación anidada.These properties enable you to specify a different subscription and resource group for the nested deployment. Todos los grupos de recursos deben existir antes de que se ejecute la implementación.All the resource groups must exist before running the deployment. Si no se especifica el grupo de recursos o el identificador de la suscripción, se utilizan los de la plantilla primaria.If you do not specify either the subscription ID or resource group, the subscription and resource group from the parent template is used.

La cuenta que utilice para implementar la plantilla debe tener permisos para implementar en el identificador de suscripción especificado.The account you use to deploy the template must have permissions to deploy to the specified subscription ID. Si la suscripción especificada no existe en un inquilino de Azure Active Directory diferente, debe agregar usuarios invitados de otro directorio.If the specified subscription exists in a different Azure Active Directory tenant, you must add guest users from another directory.

Para especificar un grupo de recursos y una suscripción diferentes, use: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')]",
        ...
    }
]

Si los grupos de recursos se encuentran en la misma suscripción, puede quitar el valor subscriptionId.If your resource groups are in the same subscription, you can remove the subscriptionId value.

En el ejemplo siguiente se implementan dos cuentas de almacenamiento: una en el grupo de recursos especificado durante la implementación y otra en un grupo de recursos que se especifica en el parámetro 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": {
            }
        }
    ]
}

Si establece resourceGroup en el nombre de un grupo de recursos que no existe, la implementación generará un error.If you set resourceGroup to the name of a resource group that does not exist, the deployment fails.

Utilización de las funciones resourceGroup() y subscription()Use the resourceGroup() and subscription() functions

En el caso de las implementaciones entre grupos de recursos, las funciones resourceGroup() y subscription() se resuelven de manera diferente en función de cómo se especifique la plantilla anidada.For cross resource group deployments, the resourceGroup() and subscription() functions resolve differently based on how you specify the nested template.

Si se inserta una plantilla dentro de otra, las funciones de la plantilla anidada se resuelve en el grupo de recursos y la suscripción primarios.If you embed one template within another template, the functions in the nested template resolve to the parent resource group and subscription. Una plantilla insertada usa el formato siguiente: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
    }
}

Si se vincula a una plantilla independiente, las funciones de la plantilla vinculada se resuelven en el grupo de recursos y la suscripción anidados.If you link to a separate template, the functions in the linked template resolve to the nested resource group and subscription. Una plantilla vinculada usa el formato siguiente: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
    }
}

Plantillas de ejemploExample templates

Las plantillas siguientes muestran varias implementaciones de grupos de recursos.The following templates demonstrate multiple resource group deployments. Después de la tabla se muestran algunos scripts para implementar las plantillas.Scripts to deploy the templates are shown after the table.

PlantillaTemplate DESCRIPCIÓNDescription
Plantilla de varias suscripcionesCross subscription template Implementa una cuenta de almacenamiento en un grupo de recursos y una cuenta de almacenamiento en un segundo grupo de recursos.Deploys one storage account to one resource group and one storage account to a second resource group. Se incluye un valor para el identificador de suscripción cuando el segundo grupo de recursos está en una suscripción diferente.Include a value for the subscription ID when the second resource group is in a different subscription.
Plantilla de propiedades de varios grupos de recursosCross resource group properties template Muestra la resolución de la función resourceGroup().Demonstrates how the resourceGroup() function resolves. No implementa ningún recurso.It does not deploy any resources.

PowerShellPowerShell

Para implementar dos cuentas de almacenamiento en dos grupos de recursos de la misma suscripción con PowerShell use:For PowerShell, to deploy two storage accounts to two resource groups in the same subscription, use:

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

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

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

Para implementar dos cuentas de almacenamiento en dos suscripciones con PowerShell, use:For PowerShell, to deploy two storage accounts to two subscriptions, use:

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

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

Select-AzSubscription -Subscription $secondSub
New-AzResourceGroup -Name $secondRG -Location eastus

Select-AzSubscription -Subscription $firstSub
New-AzResourceGroup -Name $firstRG -Location southcentralus

New-AzResourceGroupDeployment `
  -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

Para probar la resolución del objeto del grupo de recursos para la plantilla primaria, la plantilla en línea y la plantilla vinculada con PowerShell, use:For PowerShell, to test how the resource group object resolves for the parent template, inline template, and linked template, use:

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

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

En el ejemplo anterior, tanto parentRG como inlineRG se resuelven en parentGroup.In the preceding example, both parentRG and inlineRG resolve to parentGroup. linkedRG se resuelve en linkedGroup.linkedRG resolves to linkedGroup. El resultado del ejemplo anterior es: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"
                                               }
                                             }

CLI de AzureAzure CLI

Para implementar dos cuentas de almacenamiento en dos grupos de recursos de la misma suscripción con la CLI de Azure, use: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

Para implementar dos cuentas de almacenamiento en dos suscripciones con la CLI de Azure, use: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

Para probar la resolución del objeto del grupo de recursos para la plantilla primaria, la plantilla en línea y la plantilla vinculada con la CLI de Azure, use: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 

En el ejemplo anterior, tanto parentRG como inlineRG se resuelven en parentGroup.In the preceding example, both parentRG and inlineRG resolve to parentGroup. linkedRG se resuelve en linkedGroup.linkedRG resolves to linkedGroup. El resultado del ejemplo anterior es: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"
      }
    }
  }
},
...

Pasos siguientesNext steps