ARM-sjabloonfuncties in implementatiebereiken

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

Ondersteunde functies

Bij het implementeren naar verschillende scopes zijn er enkele belangrijke overwegingen:

  • De functie resourceGroup() wordt ondersteund voor implementaties van resourcegroepen.

  • De functie subscription() wordt ondersteund voor implementaties van resourcegroep en abonnement.

  • 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 is geïmplementeerd in het abonnement.

    Als u bijvoorbeeld de resource-id wilt op halen 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 extensies van de beheergroep. Aangepaste beleidsdefinities die in de beheergroep worden geïmplementeerd, zijn extensies van de beheergroep.

    Gebruik het volgende om de resource-id op te halen voor een aangepaste beleidsdefinitie op het niveau van de beheergroep:

    "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.

    Gebruik het volgende om de resource-id voor een ingebouwde beleidsdefinitie op te halen:

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

Functie-oplossing in scopes

Wanneer u implementeert in meer dan één bereik, worden de functies resourceGroup() en subscription() anders opgelost op basis van hoe u de sjabloon opgeeft. Wanneer u een koppeling maakt naar een externe sjabloon, worden de functies altijd opgelost in het bereik voor die sjabloon. Wanneer u een sjabloon nest in een bovenliggende sjabloon, gebruikt u de eigenschap om op te geven of de functies worden opgelost in de resourcegroep en het abonnement voor de bovenliggende sjabloon of de expressionEvaluationOptions geneste sjabloon. Stel de eigenschap in op inner om deze om te zetten in het bereik van de geneste sjabloon. Stel de eigenschap in op outer om deze om te zetten in het bereik van de bovenliggende sjabloon.

In de volgende tabel ziet u of de functies worden opgelost naar de bovenliggende of ingesloten resourcegroep en het abonnement.

Sjabloontype Bereik Oplossing
Geneste outer (standaard) Bovenliggende resourcegroep
Geneste Innerlijke Subresourcegroep
Gekoppelde N.v.t. Subresourcegroep

In de volgende voorbeeldsjabloon ziet u:

  • geneste sjabloon met standaardbereik (buitenste)
  • geneste sjabloon met binnenste bereik
  • gekoppelde sjabloon
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "defaultScopeTemplate",
      "resourceGroup": "inlineGroup",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
          ],
          "outputs": {
            "resourceGroupOutput": {
              "type": "string",
              "value": "[resourceGroup().name]"
            }
          }
        },
        "parameters": {}
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "innerScopeTemplate",
      "resourceGroup": "inlineGroup",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
          ],
          "outputs": {
            "resourceGroupOutput": {
              "type": "string",
              "value": "[resourceGroup().name]"
            }
          }
        },
        "parameters": {}
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "linkedTemplate",
      "resourceGroup": "linkedGroup",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "contentVersion": "1.0.0.0",
          "uri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/resourcegroupname.json"
        },
        "parameters": {}
      }
    }
  ],
  "outputs": {
    "parentRG": {
      "type": "string",
      "value": "[concat('Parent resource group is ', resourceGroup().name)]"
    },
    "defaultScopeRG": {
      "type": "string",
      "value": "[concat('Default scope resource group is ', reference('defaultScopeTemplate').outputs.resourceGroupOutput.value)]"
    },
    "innerScopeRG": {
      "type": "string",
      "value": "[concat('Inner scope resource group is ', reference('innerScopeTemplate').outputs.resourceGroupOutput.value)]"
    },
    "linkedRG": {
      "type": "string",
      "value": "[concat('Linked resource group is ', 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 van 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