Implantações do grupo de recursos com modelos do ARM
Este artigo descreve como definir o escopo de sua implantação em um grupo de recursos. Você usa um modelo do Resource Manager (modelo do ARM) para a implantação. O artigo também mostra como expandir o escopo além do grupo de recursos na operação de implantação.
Dica
Recomendamos o Bicep porque ele oferece as mesmas funcionalidades que os modelos do ARM e a sintaxe é mais fácil de usar. Para saber mais, confira implantações do grupo de recursos.
Recursos compatíveis
A maioria dos recursos devem estar implantados em um grupo de recursos. Para obter uma lista de recursos disponíveis, confira Referência do modelo ARM.
Esquema
Para modelos, use o seguinte esquema:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
...
}
Para arquivos de parâmetros, use:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
...
}
Comandos de implantação
Para implantar em um grupo de recursos, use os comandos de implantação do grupo de recursos.
Para a CLI do Azure, use az deployment group create. O exemplo a seguir implanta um modelo para criar um grupo de recursos. O grupo de recursos especificado no parâmetro --resource-group
é o grupo de recursos de destino.
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
Para obter informações mais detalhadas sobre os comandos de implantação e as opções para implantar modelos do ARM, confira:
- Implantar recursos com modelos do ARM e portal do Azure
- Implantar recursos com modelos do Resource Manager e a CLI do Azure
- Implantar recursos com modelos do Resource Manager e o Azure PowerShell
- Implantar recursos com modelos do ARM e a API REST do Azure Resource Manager
- Usar um botão de implantação para implantar modelos do repositório GitHub
- Implantar modelos do ARM do Cloud Shell
Escopos de implantação
Ao implantar em um grupo de recursos, você pode implantar recursos:
- o grupo de recursos de destino da operação
- outros grupos de recursos na mesma assinatura ou em outras assinaturas
- em qualquer assinatura no locatário
- no locatário do grupo de recursos
As únicas transições de escopo proibidas ocorrem do Grupo de Recursos para o Grupo de Gerenciamento ou da Assinatura para o Grupo de Gerenciamento.
É possível definir o escopo de um recurso de extensão para um destino diferente do destino de implantação.
O usuário que implanta o modelo deve ter acesso ao escopo especificado.
Esta seção mostra como especificar escopos diferentes. Você pode combinar esses escopos diferentes em um só modelo.
Escopo para o grupo de recursos de destino
Para implantar recursos no recurso de destino, adicione esses recursos à seção de recursos do modelo.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
resource-group-resources
],
"outputs": {}
}
Para obter um modelo de exemplo, confira Implantar no grupo de recursos de destino.
Escopo para o grupo de recursos na mesma assinatura
Para implantar recursos em um grupo de recursos diferente na mesma assinatura, adicione uma implantação aninhada e inclua a propriedade resourceGroup
. Se você não especificar a ID da assinatura ou o grupo de recursos, serão usados a assinatura e o grupo de recursos do modelo pai. Todos os grupos de recursos devem existir antes da execução da implantação.
No exemplo a seguir, a implantação aninhada tem como destino um grupo de recursos denominado 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": {}
}
Para obter um modelo de exemplo, confira Implantar em vários grupos de recursos.
Escopo para o grupo de recursos em uma assinatura diferente
Para implantar recursos em um grupo de recursos em uma assinatura diferente, adicione uma implantação aninhada e inclua as propriedades subscriptionId
e resourceGroup
. No exemplo a seguir, a implantação aninhada tem como destino um grupo de recursos denominado 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": {}
}
Para obter um modelo de exemplo, confira Implantar em vários grupos de recursos.
Escopo de assinatura
Para implantar recursos em uma assinatura, adicione uma implantação aninhada e inclua a propriedade subscriptionId
. A assinatura pode ser a assinatura para o grupo de recursos de destino ou qualquer outra assinatura no locatário. Além disso, defina a propriedade location
para a implantação aninhada.
{
"$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": {}
}
Para obter um modelo de exemplo, confira Criar grupo de recursos.
Escopo de locatário
Para criar recursos no locatário, defina scope
como /
. O usuário que está implantando o modelo deve ter o acesso necessário para implantar no locatário.
Para usar uma implantação aninhada, defina 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": {}
}
Ou é possível definir o escopo como /
para alguns tipos de recursos, como grupos de gerenciamento.
{
"$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')]"
}
}
}
Para obter mais informações, confira Grupo de gerenciamento.
Implantar no grupo de recursos de destino
Para implantar recursos no grupo de recursos de destino, defina esses recursos na seção resources
do modelo. O modelo a seguir cria uma conta de armazenamento no grupo de recursos especificado na operação de implantação.
{
"$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]"
}
}
}
Implantar em vários grupos de recursos
Você pode implantar em mais de um grupo de recursos em um único modelo do ARM. Para usar como destino um grupo de recursos diferente daquele para o modelo pai, use um modelo aninhado ou vinculado. Dentro do tipo de recurso de implantação, especifique valores para a ID de assinatura e para o grupo de recursos onde você deseja implantar o modelo aninhado. Os grupos de recursos podem estar presentes em diferentes assinaturas.
Observação
A implantação pode ser feita em 800 grupos de recursos com uma única implantação. Normalmente, essa limitação significa que você pode implantar em um grupo de recursos especificado para o modelo pai e até 799 grupos de recursos em implantações aninhadas ou vinculadas. No entanto, se o modelo pai contém apenas os modelos aninhados ou vinculados e não implanta, ele mesmo, todos os recursos, você pode incluir até 800 grupos de recursos em implantações aninhadas ou vinculadas.
O exemplo a seguir implanta duas contas de armazenamento. A primeira conta de armazenamento é implantada no grupo de recursos especificado na operação de implantação. A segunda conta de armazenamento é implantada no grupo de recursos especificado nos parâmetros 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 você definir resourceGroup
como o nome de um grupo de recursos que não existe, a implantação falhará.
Para testar o modelo anterior e ver os resultados, use o PowerShell ou a CLI do Azure.
Para implantar duas contas de armazenamento em dois grupos de recursos na mesma assinatura, use:
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
Para implantar duas contas de armazenamento em duas assinaturas, 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 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
Criar grupo de recursos
De uma implantação de grupo de recursos, você pode mudar para o nível de uma assinatura e criar um grupo de recursos. O modelo a seguir implanta uma conta de armazenamento no grupo de recursos de destino e cria um novo grupo de recursos na assinatura especificada.
{
"$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": {}
}
}
}
]
}
Próximas etapas
- Para obter um exemplo de implantação de configurações do workspace para o Microsoft Defender para Nuvem, confira deployASCwithWorkspaceSettings.json.