Share via


Funções de modelo do ARM em escopos de implantação

Com os modelos do ARM (modelos do Azure Resource Manager), você pode implantar em grupos de recursos, assinaturas, grupos de gerenciamento ou locatários. Geralmente, as funções de modelo do ARM funcionam da mesma forma para todos os escopos. Este artigo descreve as diferenças entre algumas funções dependendo do escopo.

Funções suportadas

Para implantar em escopos diferentes, veja algumas considerações importantes:

  • A função resourceGroup() é compatível com as implantações de grupo de recursos.

  • A função subscription() é compatível com as implantações de assinatura e de grupo de recursos.

  • As funções reference() e list() são compatíveis com todos os escopos.

  • Use resourceId() para obter a ID de um recurso implantado no grupo de recursos.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Use a função subscriptionResourceId() para obter a ID de um recurso implantado na assinatura.

    Por exemplo, para obter a ID de recurso de uma definição de política que foi implantada em uma assinatura, use:

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Use a função extensionResourceId() para recursos que são implementados como extensões do grupo de gerenciamento. As definições de política personalizadas que são implantadas no grupo de gerenciamento são extensões do grupo de gerenciamento.

    Para obter a ID de recurso de uma definição de política personalizada no nível do grupo de gerenciamento, use:

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Use a função tenantResourceId() para obter a ID de um recurso implantado no locatário. As definições de política internas são recursos de nível de locatário. Ao atribuir uma política interna no nível do grupo de gerenciamento, use a função tenantResourceId.

    Para obter a ID do recurso de uma definição de política interna, use:

    "policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    

Resolução da função em escopos

Quando você implantar mais de um escopo, as funções resourceGroup() e subscription() serão resolvidas de modo diferente dependendo da maneira que você especificou o modelo. Quando você vincula a um modelo externo, as funções sempre são resolvidas para o escopo desse modelo. Quando você aninha um modelo dentro de um modelo pai, use a propriedade expressionEvaluationOptions para especificar se as funções são resolvidas para o grupo de recursos e a assinatura para o modelo pai ou o modelo aninhado. Defina a propriedade como inner para resolver para o escopo do modelo aninhado. Defina a propriedade como outer para resolver para o escopo do modelo pai.

A tabela a seguir mostra se as funções são resolvidas para o grupo de recursos pai ou aninhado e para a assinatura.

Tipo do modelo Escopo Resolução
aninhado externo (padrão) Grupo de recursos pai
aninhado interna Subgrupo de recursos
vinculado N/D Subgrupo de recursos

O modelo de exemplo a seguir mostra:

  • o modelo aninhado com escopo padrão (externo)
  • o modelo aninhado com escopo interno
  • o modelo vinculado
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "defaultScopeTemplate",
      "resourceGroup": "inlineGroup",
      "properties": {
        "mode": "Incremental",
        "parameters": {},
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [],
          "outputs": {
            "resourceGroupOutput": {
              "type": "string",
              "value": "[resourceGroup().name]"
            }
          }
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "innerScopeTemplate",
      "resourceGroup": "inlineGroup",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {},
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [],
          "outputs": {
            "resourceGroupOutput": {
              "type": "string",
              "value": "[resourceGroup().name]"
            }
          }
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "linkedTemplate",
      "resourceGroup": "linkedGroup",
      "properties": {
        "mode": "Incremental",
        "parameters": {},
        "templateLink": {
          "contentVersion": "1.0.0.0",
          "uri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/resourcegroupname.json"
        }
      }
    }
  ],
  "outputs": {
    "parentRG": {
      "type": "string",
      "value": "[format('Parent resource group is {0}', resourceGroup().name)]"
    },
    "defaultScopeRG": {
      "type": "string",
      "value": "[format('Default scope resource group is {0}', reference('defaultScopeTemplate').outputs.resourceGroupOutput.value)]"
    },
    "innerScopeRG": {
      "type": "string",
      "value": "[format('Inner scope resource group is {0}', reference('innerScopeTemplate').outputs.resourceGroupOutput.value)]"
    },
    "linkedRG": {
      "type": "string",
      "value": "[format('Linked resource group is {0}', reference('linkedTemplate').outputs.resourceGroupOutput.value)]"
    }
  }
}

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

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

O resultado do exemplo anterior é:

 Name             Type                       Value
 ===============  =========================  ==========
 parentRG         String                     Parent resource group is parentGroup
 defaultScopeRG   String                     Default scope resource group is parentGroup
 innerScopeRG     String                     Inner scope resource group is inlineGroup
 linkedRG         String                     Linked resource group is linkedgroup

Próximas etapas