Funkce šablon ARM v oborech nasazení

Pomocí Azure Resource Manager (šablony ARM) můžete nasazovat do skupin prostředků, předplatných, skupin pro správu nebo tenantů. Obecně platí, že funkce šablon ARM fungují stejně pro všechny obory. Tento článek popisuje rozdíly, které existují pro některé funkce v závislosti na rozsahu.

Podporované funkce

Při nasazování do různých oborů je třeba vzít v úvahu několik důležitých věcí:

  • Funkce resourceGroup() je podporovaná pro nasazení skupin prostředků.

  • Funkce subscription() se podporuje pro nasazení skupin prostředků a předplatných.

  • Funkce reference() a list() jsou podporovány pro všechny obory.

  • Pomocí resourceId() získejte ID prostředku nasazené ve skupině prostředků.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Pomocí funkce subscriptionResourceId() získejte ID prostředku nasazené v předplatném.

    Pokud například chcete získat ID prostředku pro definici zásady, která je nasazená do předplatného, použijte:

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Pro prostředky, které jsou implementované jako rozšíření skupiny pro správu, použijte funkci extensionResourceId(). Vlastní definice zásad nasazené do skupiny pro správu jsou rozšíření skupiny pro správu.

    K získání ID prostředku pro definici vlastní zásady na úrovni skupiny pro správu použijte:

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Pomocí funkce tenantResourceId() získejte ID pro prostředek nasazený v tenantovi. Předdefinované definice zásad jsou prostředky na úrovni tenanta. Při přiřazování předdefinových zásad na úrovni skupiny pro správu použijte funkci tenantResourceId.

    Pokud chcete získat ID prostředku pro integrovanou definici zásady, použijte:

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

Rozlišení funkcí v oborech

Když nasazujete do více než jednoho oboru, funkce resourceGroup() a subscription() se překládá odlišně v závislosti na tom, jak určíte šablonu. Při propojování s externí šablonou se funkce vždy překládá na rozsah této šablony. Při vnořování šablony v rámci nadřazené šablony použijte vlastnost k určení, jestli se funkce překládá na skupinu prostředků a předplatné pro nadřazenou šablonu expressionEvaluationOptions nebo vnořenou šablonu. Nastavte vlastnost na inner , aby se překládá na obor vnořené šablony. Nastavte vlastnost na outer , aby se překládá na obor nadřazené šablony.

Následující tabulka ukazuje, jestli se funkce překládaní na nadřazenou nebo vloženou skupinu prostředků a předplatné.

Typ šablony Obor Řešení
Vnořené outer (výchozí) Nadřazená skupina prostředků
Vnořené Vnitřní Podskupina prostředků
Propojené Podskupina prostředků

Následující příklad šablony ukazuje:

  • vnořená šablona s výchozím (vnějším) oborem
  • vnořená šablona s vnitřním oborem
  • propojená šablona
{
  "$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)]"
    }
  }
}

K otestování předchozí šablony a zobrazení výsledků použijte PowerShell nebo 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

Výstup z předchozího příkladu je:

 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

Další kroky