Delen via


ARM-sjabloonfuncties in implementatiebereiken

Met ARM-sjablonen (Azure Resource Manager) kunt u implementeren in resourcegroepen, abonnementen, beheergroepen of tenants. Over het algemeen werken ARM-sjabloonfuncties hetzelfde voor alle bereiken. In dit artikel worden de verschillen beschreven die voor sommige functies bestaan, afhankelijk van het bereik.

Ondersteunde functies

Bij de implementatie naar verschillende doelen zijn er enkele belangrijke overwegingen:

  • De functie resourceGroup() wordt ondersteund voor resourcegroepimplementaties.

  • De functie subscription() wordt ondersteund voor resourcegroep- en abonnementsimplementaties.

  • De functies reference() en list() worden ondersteund voor alle scopes.

  • Gebruik resourceId() om de id op te halen voor een resource die is geïmplementeerd in de resourcegroep.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Gebruik de functie subscriptionResourceId() om de id op te halen voor een resource die in het abonnement is geïmplementeerd.

    Als u bijvoorbeeld de resource-id wilt ophalen voor een beleidsdefinitie die is geïmplementeerd in een abonnement, gebruikt u:

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Gebruik de functie extensionResourceId() voor resources die zijn geïmplementeerd als uitbreidingen van de beheergroep. Aangepaste beleidsdefinities die in de beheergroep worden geïmplementeerd, zijn extensies van de beheergroep.

    Als u de resource-id voor een aangepaste beleidsdefinitie op beheergroepsniveau wilt ophalen, gebruikt u:

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Gebruik de functie tenantResourceId() om de id op te halen voor een resource die in de tenant is geïmplementeerd. Ingebouwde beleidsdefinities zijn resources op tenantniveau. Wanneer u een ingebouwd beleid toewijst op het niveau van de beheergroep, gebruikt u de functie tenantResourceId.

    Als u de resource-id voor een ingebouwde beleidsdefinitie wilt ophalen, gebruikt u:

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

Functieresolutie in omgevingen

Wanneer u in meer dan één bereik implementeert, worden de functies resourceGroup() en subscription() op een andere manier verwerkt, afhankelijk van hoe u de sjabloon specificeert. Wanneer u een koppeling maakt naar een externe sjabloon, worden de functies altijd terugverwezen naar het bereik van die sjabloon. Wanneer u een sjabloon in een bovenliggende sjabloon plaatst, gebruikt u de expressionEvaluationOptions eigenschap om op te geven of de functies worden omgezet in de resource-groep en het abonnement voor de bovenliggende sjabloon of de geneste sjabloon. Stel de eigenschap in op inner om deze binnen de scope van de geneste sjabloon op te nemen. Stel de eigenschap in op outer om te verwijzen naar het bereik van de bovenliggende sjabloon.

In de volgende tabel wordt aangegeven of de functies worden toegewezen aan de bovenliggende of ingesloten resourcegroep en abonnement.

Sjabloontype Omvang Resolutie / Besluit
Geneste buitenste (standaard) Hoofd-resourcegroep
Geneste binnenkant Subresourcegroep
Gekoppelde Niet van toepassing. Subresourcegroep

In de volgende voorbeeldsjabloon ziet u:

  • Geneste sjabloon met standaardbereik (buitenste scope)
  • geneste sjabloon met innerlijke bereik
  • gekoppelde sjabloon
{
  "$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)]"
    }
  }
}

Als u de voorgaande sjabloon wilt testen en de resultaten wilt bekijken, gebruikt u PowerShell of Azure CLI.

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

De uitvoer uit het voorgaande voorbeeld is:

 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

Volgende stappen