Implementações de grupos de recursos com modelos do ARM

Este artigo descreve como definir o âmbito da implementação para um grupo de recursos. Utiliza um modelo do Azure Resource Manager (modelo arm) para a implementação. O artigo também mostra como expandir o âmbito para além do grupo de recursos na operação de implementação.

Dica

Recomendamos o Bicep porque oferece as mesmas capacidades que os modelos do ARM e a sintaxe é mais fácil de utilizar. Para saber mais, veja Implementações de grupos de recursos.

Recursos suportados

A maioria dos recursos pode ser implementada num grupo de recursos. Para obter uma lista de recursos disponíveis, veja Referência do modelo do ARM.

Esquema

Para modelos, utilize o seguinte esquema:

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

Para ficheiros de parâmetros, utilize:

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

Comandos de implementação

Para implementar num grupo de recursos, utilize os comandos de implementação do grupo de recursos.

Para a CLI do Azure, utilize az deployment group create. O exemplo seguinte implementa um modelo para criar um grupo de recursos. O grupo de recursos que especificar no --resource-group parâmetro é 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 implementação e as opções para implementar modelos do ARM, consulte:

Âmbitos de implementação

Ao implementar num grupo de recursos, pode implementar recursos para:

  • o grupo de recursos de destino da operação
  • outros grupos de recursos na mesma subscrição ou noutras subscrições
  • qualquer subscrição no inquilino
  • o inquilino do grupo de recursos

Um recurso de extensão pode ser confinado a um destino diferente do destino de implementação.

O utilizador que está a implementar o modelo tem de ter acesso ao âmbito especificado.

Esta secção mostra como especificar diferentes âmbitos. Pode combinar estes âmbitos diferentes num único modelo.

Âmbito para o grupo de recursos de destino

Para implementar recursos no recurso de destino, adicione esses recursos à secção 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, veja Implementar no grupo de recursos de destino.

Âmbito para grupo de recursos na mesma subscrição

Para implementar recursos num grupo de recursos diferente na mesma subscrição, adicione uma implementação aninhada e inclua a resourceGroup propriedade. Se não especificar o ID da subscrição ou o grupo de recursos, são utilizados a subscrição e o grupo de recursos do modelo principal. Todos os grupos de recursos têm de existir antes de executar a implementação.

No exemplo seguinte, a implementação aninhada destina-se a um grupo de recursos com o nome 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, veja Implementar em vários grupos de recursos.

Âmbito do grupo de recursos numa subscrição diferente

Para implementar recursos num grupo de recursos numa subscrição diferente, adicione uma implementação aninhada e inclua as subscriptionId propriedades e resourceGroup . No exemplo seguinte, a implementação aninhada destina-se a um grupo de recursos com o nome 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, veja Implementar em vários grupos de recursos.

Âmbito da subscrição

Para implementar recursos numa subscrição, adicione uma implementação aninhada e inclua a subscriptionId propriedade. A subscrição pode ser a subscrição do grupo de recursos de destino ou qualquer outra subscrição no inquilino. Além disso, defina a location propriedade para a implementaçã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, veja Criar grupo de recursos.

Âmbito para inquilino

Para criar recursos no inquilino, defina como scope/. O utilizador que está a implementar o modelo tem de ter o acesso necessário para implementar no inquilino.

Para utilizar uma implementaçã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": {}
}

Em alternativa, pode definir o âmbito para / alguns tipos de recursos, como grupos de gestão.

{
  "$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, veja Grupo de gestão.

Implementar no grupo de recursos de destino

Para implementar recursos no grupo de recursos de destino, defina esses recursos na resources secção do modelo. O modelo seguinte cria uma conta de armazenamento no grupo de recursos especificado na operação de implementaçã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]"
    }
  }
}

Implementar em vários grupos de recursos

Pode implementar em mais do que um grupo de recursos num único modelo do ARM. Para direcionar um grupo de recursos diferente daquele para o modelo principal, utilize um modelo aninhado ou ligado. No tipo de recurso de implementação, especifique os valores do ID da subscrição e do grupo de recursos para o qual pretende implementar o modelo aninhado. Os grupos de recursos podem existir em subscrições diferentes.

Nota

Pode implementar em 800 grupos de recursos numa única implementação. Normalmente, esta limitação significa que pode implementar num grupo de recursos especificado para o modelo principal e até 799 grupos de recursos em implementações aninhadas ou ligadas. No entanto, se o modelo principal contiver apenas modelos aninhados ou ligados e não implementar recursos, pode incluir até 800 grupos de recursos em implementações aninhadas ou ligadas.

O exemplo seguinte implementa duas contas de armazenamento. A primeira conta de armazenamento é implementada no grupo de recursos especificado na operação de implementação. A segunda conta de armazenamento é implementada no grupo de recursos especificado nos secondResourceGroup parâmetros 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 definir resourceGroup o nome de um grupo de recursos que não existe, a implementação falhará.

Para testar o modelo anterior e ver os resultados, utilize o PowerShell ou a CLI do Azure.

Para implementar duas contas de armazenamento em dois grupos de recursos na mesma subscrição, utilize:

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 implementar duas contas de armazenamento em duas subscrições, utilize:

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

A partir de uma implementação de grupo de recursos, pode mudar para o nível de uma subscrição e criar um grupo de recursos. O modelo seguinte implementa uma conta de armazenamento no grupo de recursos de destino e cria um novo grupo de recursos na subscrição 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": {}
        }
      }
    }
  ]
}

Passos seguintes