Funkce šablony ARM v oborech nasazení

Pomocí šablon Azure Resource Manager (šablony ARM) můžete nasadit 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í u některých funkcí v závislosti na rozsahu.

Podporované funkce

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

  • Pro nasazení skupin prostředků se podporuje funkce resourceGroup().

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

  • Funkce reference() a list() jsou podporované pro všechny obory.

  • Pomocí resourceId() získáte ID prostředku nasazeného 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ého v předplatném.

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

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

    Pokud chcete získat 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 prostředku nasazeného v tenantovi. Předdefinované definice zásad jsou prostředky na úrovni tenanta. Při přiřazování předdefinovaných zásad na úrovni skupiny pro správu použijte funkci tenantResourceId.

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

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

Rozlišení funkcí v oborech

Při nasazení do více než jednoho oboru se funkce resourceGroup() a subscription() přeloží odlišně podle toho, jak šablonu zadáte. Při propojení s externí šablonou se funkce vždy přeloží na obor této šablony. Když vnoříte šablonu do nadřazené šablony, pomocí expressionEvaluationOptions vlastnosti určete, jestli se funkce přeloží do skupiny prostředků a předplatného nadřazené šablony nebo vnořené šablony. Nastavte vlastnost na hodnotu inner , aby se přeložila na rozsah vnořené šablony. Nastavte vlastnost na hodnotu outer , aby se přeložil na rozsah nadřazené šablony.

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

Typ šablony Obor Řešení
Vnořené vnější (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",
  "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)]"
    }
  }
}

Pokud chcete otestovat předchozí šablonu a zobrazit výsledky, 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