Compartilhar via


Funções de modelos ARM em escopos de implantação

Com 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 que existem para algumas funções e como essas diferenças dependem do escopo.

Funções com suporte

Considere o seguinte ao implantar em escopos diferentes:

  • A resourceGroup() função tem suporte para implantações de grupo de recursos.

  • A subscription() função tem suporte para implantações de grupo de recursos e assinatura.

  • As reference() funções e list() têm suporte para 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 subscriptionResourceId() função para obter a ID de um recurso implantado na assinatura.

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

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

    Para obter a ID do recurso para 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 tenantResourceId() função para obter a ID de um recurso implantado no locatário. Definições de política incorporadas são recursos no nível de locatário. Ao atribuir uma política interna no nível do grupo de gerenciamento, use a tenantResourceId função.

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

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

Resolução da função em escopos

Quando você implanta em mais de um escopo, as funções e subscription() as resourceGroup() funções são resolvidas de forma diferente com base em como você especifica o modelo. Quando você vincula a um modelo externo, as funções sempre são resolvidas para o escopo desse modelo. Quando você aninhar um modelo dentro de um modelo pai, use a expressionEvaluationOptions propriedade para especificar se as funções são resolvidas para o grupo de recursos e a assinatura do modelo pai ou do 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 inserido e a assinatura.

Tipo de modelo Scope Resolução
aninhado externo (padrão) Grupo de recursos pai
aninhado interna Sub-grupo de recursos
ligado Não aplicável Sub-grupo de recursos

O modelo de exemplo a seguir mostra um:

  • Modelo aninhado com um escopo padrão (outer).
  • Modelo aninhado com um inner escopo.
  • 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