ARM-mallfunktioner i distributionsomfång

Med Azure Resource Manager -mallar (ARM-mallar) kan du distribuera till resursgrupper, prenumerationer, hanteringsgrupper eller klienter. I allmänhet fungerar ARM-mallfunktioner på samma sätt för alla omfång. I den här artikeln beskrivs skillnaderna som finns för vissa funktioner beroende på omfånget.

Funktioner som stöds

När du distribuerar till olika omfång finns det några viktiga överväganden:

  • Funktionen resourceGroup() stöds för distributioner av resursgrupper.

  • Funktionen subscription() stöds för resursgrupps- och prenumerationsdistributioner.

  • Funktionerna reference() och list() stöds för alla omfång.

  • Använd resourceId() för att hämta ID:t för en resurs som distribuerats i resursgruppen.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Använd funktionen subscriptionResourceId() för att hämta ID:t för en resurs som distribuerats i prenumerationen.

    Om du till exempel vill hämta resurs-ID:t för en principdefinition som distribueras till en prenumeration använder du:

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Använd funktionen extensionResourceId() för resurser som implementeras som tillägg till hanteringsgruppen. Anpassade principdefinitioner som distribueras till hanteringsgruppen är tillägg av hanteringsgruppen.

    Om du vill hämta resurs-ID:t för en anpassad principdefinition på hanteringsgruppsnivå använder du:

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Använd funktionen tenantResourceId() för att hämta ID:t för en resurs som distribuerats i klientorganisationen. Inbyggda principdefinitioner är resurser på klientorganisationsnivå. När du tilldelar en inbyggd princip på hanteringsgruppsnivå använder du funktionen tenantResourceId.

    Om du vill hämta resurs-ID:t för en inbyggd principdefinition använder du:

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

Funktionsupplösning i omfång

När du distribuerar till mer än ett omfång matchas funktionerna resourceGroup() och subscription() på olika sätt beroende på hur du anger mallen. När du länkar till en extern mall matchas funktionerna alltid till mallens omfång. När du kapslas en mall i en överordnad mall använder du egenskapen för att ange om funktionerna ska matcha resursgruppen och prenumerationen för den överordnade mallen eller den expressionEvaluationOptions kapslade mallen. Ange egenskapen till för inner att matcha omfånget för den kapslade mallen. Ange egenskapen till för outer att matcha omfånget för den överordnade mallen.

I följande tabell visas om funktionerna matchar den överordnade eller inbäddade resursgruppen och prenumerationen.

Malltyp Omfång Lösning
Kapslade outer (standard) Överordnad resursgrupp
Kapslade Inre Underresursgrupp
Länkade Ej tillämpligt Underresursgrupp

Följande exempelmall visar:

  • kapslad mall med standardomfång (yttre)
  • kapslad mall med inre omfång
  • länkad mall
{
  "$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)]"
    }
  }
}

Om du vill testa föregående mall och se resultatet använder du PowerShell eller 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

Utdata från föregående exempel är:

 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

Nästa steg