Funkcje szablonu usługi ARM w zakresach wdrażania
Za pomocą szablonów usługi Azure Resource Manager (szablonów usługi ARM) można wdrażać w grupach zasobów, subskrypcjach, grupach zarządzania lub dzierżawach. Ogólnie rzecz biorąc, funkcje szablonu usługi ARM działają tak samo dla wszystkich zakresów. W tym artykule opisano różnice, które istnieją dla niektórych funkcji w zależności od zakresu.
Obsługiwane funkcje
Podczas wdrażania w różnych zakresach należy wziąć pod uwagę pewne ważne zagadnienia:
Funkcja resourceGroup() jest obsługiwana w przypadku wdrożeń grup zasobów.
Funkcja subscription() jest obsługiwana w przypadku wdrożeń grup zasobów i subskrypcji.
Funkcje reference() i list() są obsługiwane dla wszystkich zakresów.
Użyj identyfikatora resourceId(), aby uzyskać identyfikator zasobu wdrożonego w grupie zasobów.
"subnet": { "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]" }
Użyj funkcji subscriptionResourceId(), aby uzyskać identyfikator zasobu wdrożonego w subskrypcji.
Aby na przykład uzyskać identyfikator zasobu dla definicji zasad wdrożonej w subskrypcji, użyj:
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
Użyj funkcji extensionResourceId() dla zasobów implementowanych jako rozszerzenia grupy zarządzania. Niestandardowe definicje zasad wdrażane w grupie zarządzania to rozszerzenia grupy zarządzania.
Aby uzyskać identyfikator zasobu dla niestandardowej definicji zasad na poziomie grupy zarządzania, użyj:
"policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Użyj funkcji tenantResourceId(), aby uzyskać identyfikator zasobu wdrożonego w dzierżawie. Wbudowane definicje zasad to zasoby na poziomie dzierżawy. Podczas przypisywania wbudowanych zasad na poziomie grupy zarządzania użyj funkcji tenantResourceId.
Aby uzyskać identyfikator zasobu dla wbudowanej definicji zasad, użyj:
"policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Rozpoznawanie funkcji w zakresach
Podczas wdrażania w więcej niż jednym zakresie funkcje resourceGroup() i subscription() są rozpoznawane inaczej w zależności od sposobu określania szablonu. Po połączeniu z szablonem zewnętrznym funkcje zawsze rozpoznają zakres tego szablonu. Podczas zagnieżdżania szablonu w szablonie nadrzędnym użyj expressionEvaluationOptions
właściwości , aby określić, czy funkcje są rozpoznawane dla grupy zasobów i subskrypcji szablonu nadrzędnego, czy szablonu zagnieżdżonego. Ustaw właściwość , aby inner
rozpoznać zakres szablonu zagnieżdżonego. Ustaw właściwość , aby outer
rozpoznać zakres szablonu nadrzędnego.
W poniższej tabeli przedstawiono, czy funkcje są rozpoznawane jako nadrzędna lub osadzona grupa zasobów i subskrypcja.
Typ szablonu | Zakres | Rozwiązanie |
---|---|---|
Zagnieżdżone | zewnętrzne (domyślne) | Nadrzędna grupa zasobów |
Zagnieżdżone | Wewnętrzny | Podgrupa zasobów |
Połączone | Nie dotyczy | Podgrupa zasobów |
Poniższy przykładowy szablon przedstawia:
- szablon zagnieżdżony z domyślnym (zewnętrznym) zakresem
- szablon zagnieżdżony z zakresem wewnętrznym
- połączony szablon
{
"$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)]"
}
}
}
Aby przetestować poprzedni szablon i wyświetlić wyniki, użyj programu PowerShell lub interfejsu wiersza polecenia platformy Azure.
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
Dane wyjściowe z poprzedniego przykładu to:
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
Następne kroki
- Aby zrozumieć sposób definiowania parametrów w szablonie, zobacz Omówienie struktury i składni szablonów usługi ARM.
- Aby uzyskać wskazówki dotyczące rozwiązywania typowych błędów wdrażania, zobacz Rozwiązywanie typowych błędów wdrażania platformy Azure przy użyciu usługi Azure Resource Manager.
- Aby uzyskać informacje na temat wdrażania szablonu wymagającego tokenu SAS, zobacz Wdrażanie prywatnego szablonu usługi ARM przy użyciu tokenu SAS.