Funkcje szablonu usługi ARM w zakresach wdrażania

Za pomocą szablonów usługi Azure Resource Manager (szablonów usługi ARM) można wdrażać w grupach zasobów, subskrypcjach, grupach zarządzania lub dzierżawach. Ogólnie rzecz biorąc, funkcje szablonu usługi ARM działają tak samo dla wszystkich zakresów. W tym artykule opisano różnice, które istnieją dla niektórych funkcji w zależności od zakresu.

Obsługiwane funkcje

Podczas wdrażania w różnych zakresach należy wziąć pod uwagę pewne ważne zagadnienia:

  • Funkcja resourceGroup() jest obsługiwana w przypadku wdrożeń grup zasobów.

  • Funkcja subscription() jest obsługiwana w przypadku wdrożeń grup zasobów i subskrypcji.

  • Funkcje reference() i list()obsługiwane dla wszystkich zakresów.

  • Użyj identyfikatora resourceId(), aby uzyskać identyfikator zasobu wdrożonego w grupie zasobów.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Użyj funkcji subscriptionResourceId(), aby uzyskać identyfikator zasobu wdrożonego w subskrypcji.

    Aby na przykład uzyskać identyfikator zasobu dla definicji zasad wdrożonej w subskrypcji, użyj:

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Użyj funkcji extensionResourceId() dla zasobów implementowanych jako rozszerzenia grupy zarządzania. Niestandardowe definicje zasad wdrażane w grupie zarządzania to rozszerzenia grupy zarządzania.

    Aby uzyskać identyfikator zasobu dla niestandardowej definicji zasad na poziomie grupy zarządzania, użyj:

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Użyj funkcji tenantResourceId(), aby uzyskać identyfikator zasobu wdrożonego w dzierżawie. Wbudowane definicje zasad to zasoby na poziomie dzierżawy. Podczas przypisywania wbudowanych zasad na poziomie grupy zarządzania użyj funkcji tenantResourceId.

    Aby uzyskać identyfikator zasobu dla wbudowanej definicji zasad, użyj:

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

Rozpoznawanie funkcji w zakresach

Podczas wdrażania w więcej niż jednym zakresie funkcje resourceGroup() i subscription() są rozpoznawane inaczej w zależności od sposobu określania szablonu. Po połączeniu z szablonem zewnętrznym funkcje zawsze rozpoznają zakres tego szablonu. Podczas zagnieżdżania szablonu w szablonie nadrzędnym użyj expressionEvaluationOptions właściwości , aby określić, czy funkcje są rozpoznawane dla grupy zasobów i subskrypcji szablonu nadrzędnego, czy szablonu zagnieżdżonego. Ustaw właściwość , aby inner rozpoznać zakres szablonu zagnieżdżonego. Ustaw właściwość , aby outer rozpoznać zakres szablonu nadrzędnego.

W poniższej tabeli przedstawiono, czy funkcje są rozpoznawane jako nadrzędna lub osadzona grupa zasobów i subskrypcja.

Typ szablonu Zakres Rozwiązanie
Zagnieżdżone zewnętrzne (domyślne) Nadrzędna grupa zasobów
Zagnieżdżone Wewnętrzny Podgrupa zasobów
Połączone Nie dotyczy Podgrupa zasobów

Poniższy przykładowy szablon przedstawia:

  • szablon zagnieżdżony z domyślnym (zewnętrznym) zakresem
  • szablon zagnieżdżony z zakresem wewnętrznym
  • połączony szablon
{
  "$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)]"
    }
  }
}

Aby przetestować poprzedni szablon i wyświetlić wyniki, użyj programu PowerShell lub interfejsu wiersza polecenia platformy 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

Dane wyjściowe z poprzedniego przykładu to:

 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

Następne kroki