ARM-sjabloonfuncties in implementatiebereiken
Met Azure Resource Manager-sjablonen (ARM-sjablonen) kunt u implementeren in resourcegroepen, abonnementen, beheergroepen of tenants. Over het algemeen werken ARM-sjabloonfuncties hetzelfde voor alle bereiken. In dit artikel worden de verschillen beschreven die bestaan voor sommige functies, afhankelijk van het bereik.
Ondersteunde functies
Bij het implementeren in verschillende bereiken zijn er enkele belangrijke overwegingen:
De functie resourceGroup() wordt ondersteund voor resourcegroepimplementaties.
De functie subscription() wordt ondersteund voor implementaties van resourcegroepen en abonnementen.
De functies reference() en list() worden ondersteund voor alle bereiken.
Gebruik resourceId() om de id op te halen voor een resource die is geïmplementeerd in de resourcegroep.
"subnet": { "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]" }
Gebruik de functie subscriptionResourceId() om de id op te halen voor een resource die in het abonnement is geïmplementeerd.
Als u bijvoorbeeld de resource-id wilt ophalen voor een beleidsdefinitie die is geïmplementeerd in een abonnement, gebruikt u:
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
Gebruik de functie extensionResourceId() voor resources die zijn geïmplementeerd als uitbreidingen van de beheergroep. Aangepaste beleidsdefinities die in de beheergroep worden geïmplementeerd, zijn uitbreidingen van de beheergroep.
Als u de resource-id voor een aangepaste beleidsdefinitie op het niveau van de beheergroep wilt ophalen, gebruikt u:
"policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Gebruik de functie tenantResourceId() om de id op te halen voor een resource die in de tenant is geïmplementeerd. Ingebouwde beleidsdefinities zijn resources op tenantniveau. Wanneer u een ingebouwd beleid op beheergroepniveau toewijst, gebruikt u de functie tenantResourceId.
Als u de resource-id voor een ingebouwde beleidsdefinitie wilt ophalen, gebruikt u:
"policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Functieomzetting in bereiken
Wanneer u implementeert in meer dan één bereik, worden de functies resourceGroup() en subscription() verschillend omgezet op basis van de manier waarop u de sjabloon opgeeft. Wanneer u een koppeling naar een externe sjabloon koppelt, worden de functies altijd omgezet in het bereik voor die sjabloon. Wanneer u een sjabloon nestt in een bovenliggende sjabloon, gebruikt u de expressionEvaluationOptions
eigenschap om op te geven of de functies worden omgezet in de resourcegroep en het abonnement voor de bovenliggende sjabloon of de geneste sjabloon. Stel de eigenschap in op inner
om het bereik voor de geneste sjabloon op te lossen. Stel de eigenschap in op outer
om op te lossen naar het bereik van de bovenliggende sjabloon.
In de volgende tabel ziet u of de functies worden omgezet in de bovenliggende of ingesloten resourcegroep en het abonnement.
Sjabloontype | Bereik | Oplossing |
---|---|---|
Geneste | outer (standaard) | Bovenliggende resourcegroep |
Geneste | Innerlijke | Subresourcegroep |
Gekoppelde | N.v.t. | Subresourcegroep |
In de volgende voorbeeldsjabloon ziet u het volgende:
- geneste sjabloon met standaard (buitenste) bereik
- geneste sjabloon met binnenbereik
- gekoppelde sjabloon
{
"$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)]"
}
}
}
Als u de voorgaande sjabloon wilt testen en de resultaten wilt bekijken, gebruikt u PowerShell of 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
De uitvoer van het voorgaande voorbeeld is:
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
Volgende stappen
- Zie Inzicht in de structuur en syntaxis van ARM-sjablonen voor meer informatie over het definiëren van parameters in uw sjabloon.
- Zie Veelvoorkomende implementatiefouten in Azure oplossen met Azure Resource Manager voor tips over het oplossen van veelvoorkomende implementatiefouten.
- Zie Een privé-ARM-sjabloon implementeren met SAS-token voor informatie over het implementeren van een sjabloon waarvoor een SAS-token is vereist.