ARM-mallfunktioner i distributionsomfång

Med Azure Resource Manager mallar (ARM-mallar) kan du distribuera till resursgrupper, prenumerationer, hanteringsgrupper eller klientorganisationer. I allmänhet fungerar ARM-mallfunktioner på samma sätt för alla omfång. Den här artikeln beskriver de skillnader 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 resursgruppsdistributioner.

  • 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 för hanteringsgruppen. Anpassade principdefinitioner som distribueras till hanteringsgruppen är tillägg för 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å klientnivå. 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'))]"
    

Funktionsmatchning i omfång

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

Följande tabell visar om funktionerna matchar den överordnade eller inbäddade resursgruppen och prenumerationen.

Malltyp Omfång Lösning
Kapslade yttre (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",
  "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)]"
    }
  }
}

Om du vill testa föregående mall och se resultaten 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