Развертывание ресурсов Azure в нескольких подписках или группах ресурсовDeploy Azure resources to more than one subscription or resource group

Примечание

Эта статья была изменена и теперь содержит сведения о новом модуле Az для Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Вы по-прежнему можете использовать модуль AzureRM, исправления ошибок для которого будут продолжать выпускаться как минимум до декабря 2020 г.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Дополнительные сведения о совместимости модуля Az с AzureRM см. в статье Introducing the new Azure PowerShell Az module (Знакомство с новым модулем Az для Azure PowerShell).To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Инструкции по установке модуля Az см. в статье об установке Azure PowerShell.For Az module installation instructions, see Install Azure PowerShell.

Как правило, все ресурсы в шаблоне развертываются в отдельную группу ресурсов.Typically, you deploy all the resources in your template to a single resource group. Тем не менее возможны ситуации, когда необходимо развернуть набор ресурсов одновременно, но при этом разместить их в отдельных подписках или группах ресурсов.However, there are scenarios where you want to deploy a set of resources together but place them in different resource groups or subscriptions. Например, вы захотите развернуть резервную копию виртуальной машины для Azure Site Recovery в отдельную группу ресурсов или расположение.For example, you may want to deploy the backup virtual machine for Azure Site Recovery to a separate resource group and location. Resource Manager позволяет использовать вложенные шаблоны, с помощью которых ресурсы можно развертывать в разных подписках и группах ресурсов, а не только в подписках и группах ресурсов родительского шаблона.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.

Примечание

Развертывание можно выполнять только в пять групп ресурсов в рамках одного развертывания.You can deploy to only five resource groups in a single deployment. Как правило, это ограничение означает, что можно выполнить развертывание в одной группе ресурсов, указанной для родительского шаблона, и максимум в четырех группах ресурсов во вложенных или связанных развертываниях.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. Но если родительский шаблон содержит только вложенные или связанные шаблоны и сам по себе не развертывает ресурсы, во вложенные или связанные развертывания можно включить до пяти групп ресурсов.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.

Выбор подписки и группы ресурсовSpecify a subscription and resource group

Чтобы подключиться к другому ресурсу, используйте вложенный или связанный шаблон.To target a different resource, use a nested or linked template. В ресурсах типа Microsoft.Resources/deployments содержатся параметры subscriptionId и resourceGroup.The Microsoft.Resources/deployments resource type provides parameters for subscriptionId and resourceGroup. Эти свойства позволяют указывать различные подписки и группы ресурсов для вложенного развертывания.These properties enable you to specify a different subscription and resource group for the nested deployment. Все группы ресурсов необходимо создать до выполнения развертывания.All the resource groups must exist before running the deployment. Если не указать идентификатор подписки или группу ресурсов, будут использованы подписка и группа ресурсов из родительского шаблона.If you do not specify either the subscription ID or resource group, the subscription and resource group from the parent template is used.

Учетная запись, которая используется для развертывания шаблона, должна иметь разрешения на развертывание с указанным идентификатором подписки.The account you use to deploy the template must have permissions to deploy to the specified subscription ID. Если указанная подписка существует в другом клиенте Azure Active Directory, необходимо добавить гостевых пользователей из другого каталога.If the specified subscription exists in a different Azure Active Directory tenant, you must add guest users from another directory.

Чтобы указать другую группу ресурсов и подписку, используйте следующий код: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')]",
        ...
    }
]

Если группы ресурсов находятся в одной подписке, значение subscriptionId можно удалить.If your resource groups are in the same subscription, you can remove the subscriptionId value.

В приведенном ниже примере развертываются две учетные записи хранения: одна в группе ресурсов, указанной во время развертывания, другая — в группе ресурсов, указанной в параметре 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": {
            }
        }
    ]
}

Если в качестве значения параметра resourceGroup задать имя несуществующей группы ресурсов, развертывание завершится сбоем.If you set resourceGroup to the name of a resource group that does not exist, the deployment fails.

Использование функций resourceGroup() и subscription()Use the resourceGroup() and subscription() functions

При развертывании в нескольких группах ресурсов результат выполнения функций resourceGroup() и subscription() зависит от способа, с помощью которого указан вложенный шаблон.For cross resource group deployments, the resourceGroup() and subscription() functions resolve differently based on how you specify the nested template.

При внедрении одного шаблона в другой функции во вложенном шаблоне разрешаются в родительской группе ресурсов и подписке.If you embed one template within another template, the functions in the nested template resolve to the parent resource group and subscription. Внедренный шаблон использует следующий формат: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
    }
}

При связывании отдельного шаблона функции в связанном шаблоне разрешаются в родительской группе ресурсов и подписке.If you link to a separate template, the functions in the linked template resolve to the nested resource group and subscription. Связанный шаблон использует следующий формат: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
    }
}

Образцы шаблоновExample templates

В следующих шаблонах демонстрируется развертывание в нескольких группах ресурсов.The following templates demonstrate multiple resource group deployments. Скрипты для развертывания шаблонов приведены после таблицы.Scripts to deploy the templates are shown after the table.

ШаблонTemplate ОписаниеDescription
Шаблон для развертывания в нескольких подпискахCross subscription template Развертывание одной учетной записи хранения в одной группе ресурсов и еще одной учетной записи хранения в другой группе ресурсов.Deploys one storage account to one resource group and one storage account to a second resource group. Укажите значение идентификатора подписки, если вторая группа ресурсов находится в другой подписке.Include a value for the subscription ID when the second resource group is in a different subscription.
Шаблон свойств для развертывания в нескольких группах ресурсовCross resource group properties template В этом шаблоне показано, как разрешается функция resourceGroup().Demonstrates how the resourceGroup() function resolves. Он не используется для развертывания ресурсов.It does not deploy any resources.

PowerShellPowerShell

Чтобы развернуть две учетные записи хранения в двух группах ресурсов в одной подписке с помощью PowerShell, используйте следующий код: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

Чтобы развернуть две учетные записи хранения в двух подписках с помощью PowerShell, используйте следующий код: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

Чтобы проверить, как разрешается объект группы ресурсов для родительского, встроенного и связанного шаблонов с помощью PowerShell, используйте следующий код: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

В приведенном выше примере parentRG и inlineRG разрешаются в parentGroup.In the preceding example, both parentRG and inlineRG resolve to parentGroup. linkedRG разрешается в linkedGroup.linkedRG resolves to linkedGroup. Выходные данные из предыдущего примера: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"
                                               }
                                             }

Azure CLIAzure CLI

Чтобы развернуть две учетные записи хранения в двух группах ресурсов в одной подписке с помощью Azure CLI, используйте следующий код: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

Чтобы развернуть две учетные записи хранения в двух подписках с помощью Azure CLI, используйте следующий код: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

Чтобы проверить, как разрешается объект группы ресурсов для родительского, встроенного и связанного шаблонов с помощью Azure CLI, используйте следующий код: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 

В приведенном выше примере parentRG и inlineRG разрешаются в parentGroup.In the preceding example, both parentRG and inlineRG resolve to parentGroup. linkedRG разрешается в linkedGroup.linkedRG resolves to linkedGroup. Выходные данные из предыдущего примера: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"
      }
    }
  }
},
...

Дальнейшие действияNext steps