Azure Resource Manager-Vorlagenfunktionen in Bereitstellungsbereichen

Mit Azure Resource Manager-Vorlagen (ARM-Vorlagen) können Sie Ressourcen in Ressourcengruppen, Abonnements, Verwaltungsgruppen oder Mandanten bereitstellen. Allgemein funktionieren ARM-Vorlagenfunktionen für alle Bereiche gleich. In diesem Artikel werden die Unterschiede beschrieben, die bei einigen Funktionen je nach Bereich bestehen.

Unterstützte Funktionen

Beim Bereitstellen in verschiedenen Bereichen sind einige wichtige Aspekte zu beachten:

  • Die Funktion resourceGroup() wird für Bereitstellungen in Ressourcengruppen unterstützt.

  • Die Funktion subscription() wird für Bereitstellungen in Ressourcengruppen und Abonnements unterstützt.

  • Die Funktionen reference() und list() werden für alle Bereiche unterstützt.

  • Verwenden Sie resourceId(), um die ID einer Ressource abzurufen, die in der Ressourcengruppe bereitgestellt wurde.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Verwenden Sie die Funktion subscriptionResourceId(), um die ID einer Ressource abzurufen, die im Abonnement bereitgestellt wurde.

    Verwenden Sie beispielsweise Folgendes, um die Ressourcen-ID für eine Richtliniendefinition abzurufen, die für ein Abonnement bereitgestellt wird:

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Verwenden Sie die Funktion extensionResourceId() für Ressourcen, die als Erweiterungen der Verwaltungsgruppe implementiert sind. Benutzerdefinierte Richtliniendefinitionen, die für die Verwaltungsgruppe bereitgestellt werden, sind Erweiterungen der Verwaltungsgruppe.

    Verwenden Sie den folgenden Code, um die Ressourcen-ID für eine benutzerdefinierte Richtliniendefinition auf Verwaltungsgruppenebene zu erhalten:

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Verwenden Sie die Funktion tenantResourceId(), um die ID einer Ressource abzurufen, die im Mandanten bereitgestellt wurde. Integrierte Richtliniendefinitionen sind Ressourcen auf Mandantenebene. Wenn Sie eine integrierte Richtlinie auf der Verwaltungsgruppenebene zuweisen, verwenden Sie die Funktion tenantResourceId.

    Verwenden Sie beispielsweise den folgenden Code, um die Ressourcen-ID für eine integrierte Richtliniendefinition abzurufen:

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

Funktionsauflösung in Bereichen

Bei der Bereitstellung in mehreren Bereichen werden die Funktionen resouceGroup() und subscription() unterschiedlich aufgelöst, je nachdem, wie Sie die Vorlage festlegen. Wenn Sie auf eine externe Vorlage verweisen, werden die Funktionen immer im Bereich dieser Vorlage aufgelöst. Wenn Sie eine Vorlage in einer übergeordneten Vorlage schachteln, geben Sie mit der Eigenschaft expressionEvaluationOptions an, ob die Funktionen in die Ressourcengruppe und das Abonnement für die übergeordnete Vorlage oder die geschachtelte Vorlage aufgelöst werden. Legen Sie die Eigenschaft auf inner fest, um in den Bereich für die geschachtelte Vorlage aufzulösen. Legen Sie die Eigenschaft auf outer fest, um in den Bereich für die übergeordnete Vorlage aufzulösen.

Die folgende Tabelle zeigt, ob die Funktionen in die übergeordnete oder eingebettete Ressourcengruppe und das zugehörige Abonnement aufgelöst werden.

Vorlagentyp `Scope` Lösung
Geschachtelt Außen (Standard) Übergeordnete Ressourcengruppe
Geschachtelt Innerer Join Unterressourcengruppe
Verknüpft Unterressourcengruppe

Die folgende Beispielvorlage zeigt Folgendes:

  • eine geschachtelte Vorlage mit Standardbereich (außen)
  • geschachtelte Vorlage mit innerem Bereich
  • verknüpfte Vorlage
{
  "$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)]"
    }
  }
}

Verwenden Sie PowerShell oder die Azure CLI, um die vorherige Vorlage zu testen und die Ergebnisse anzuzeigen.

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

Die Ausgabe aus dem vorherigen Beispiel lautet wie folgt:

 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ächste Schritte