Funzioni del modello di Resource Manager negli ambiti di distribuzione
Con i modelli di Azure Resource Manager è possibile eseguire la distribuzione in gruppi di risorse, sottoscrizioni, gruppi di gestione o tenant. In genere, le funzioni del modello di Resource Manager funzionano allo stesso modo per tutti gli ambiti. Questo articolo descrive le differenze esistenti per alcune funzioni a seconda dell'ambito.
Funzioni supportate
Quando si esegue la distribuzione in ambiti diversi, è necessario tenere presenti alcune considerazioni importanti:
La funzione resourceGroup() è supportata per le distribuzioni di gruppi di risorse.
La funzione subscription() è supportata per le distribuzioni di gruppi di risorse e sottoscrizioni.
Le funzioni reference() e list() sono supportate per tutti gli ambiti.
Usare resourceId() per ottenere l'ID per una risorsa distribuita nel gruppo di risorse.
"subnet": { "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]" }
Usare la funzione subscriptionResourceId() per ottenere l'ID per una risorsa distribuita nella sottoscrizione.
Ad esempio, per ottenere l'ID risorsa per una definizione di criteri distribuita in una sottoscrizione, usare:
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
Usare la funzione extensionResourceId() per le risorse implementate come estensioni del gruppo di gestione. Le definizioni di criteri personalizzate distribuite nel gruppo di gestione sono estensioni del gruppo di gestione.
Per ottenere l'ID risorsa per una definizione di criteri personalizzata a livello di gruppo di gestione, usare:
"policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Usare la funzione tenantResourceId() per ottenere l'ID per una risorsa distribuita nel tenant. Le definizioni dei criteri predefinite sono risorse a livello di tenant. Quando si assegnano criteri predefiniti a livello di gruppo di gestione, usare la funzione tenantResourceId.
Per ottenere l'ID risorsa per una definizione di criteri predefinita, usare:
"policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Risoluzione delle funzioni negli ambiti
Quando si esegue la distribuzione in più ambiti, le funzioni resourceGroup() e subscription() vengono risolte in modo diverso in base a come si specifica il modello. Quando si esegue il collegamento a un modello esterno, le funzioni vengono sempre risolte nell'ambito di tale modello. Quando si annida un modello all'interno di un modello padre, usare la proprietà expressionEvaluationOptions
per specificare se le funzioni vengono risolte nel gruppo di risorse e nella sottoscrizione del modello padre o del modello annidato. Impostare la proprietà su inner
per risolvere le funzioni nell'ambito del modello annidato. Impostare la proprietà su outer
per risolvere le funzioni nell'ambito del modello padre.
La tabella seguente mostra se le funzioni vengono risolte nella sottoscrizione e nel gruppo di risorse padre o incorporato.
Tipo di modello | Ambito | Risoluzione |
---|---|---|
annidato | esterno (impostazione predefinita) | Gruppo di risorse padre |
annidato | interno | Gruppo di risorse secondarie |
collegato | N/D | Gruppo di risorse secondarie |
Il modello di esempio seguente mostra:
- modello annidato con ambito (esterno) esterno
- modello annidato con ambito interno
- modello collegato
{
"$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)]"
}
}
}
Per testare il modello precedente e visualizzare i risultati, usare PowerShell o l'interfaccia della riga di comando di 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
L'output dell'esempio precedente è:
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
Passaggi successivi
- Per informazioni su come definire i parametri nel modello, vedere Comprendere la struttura e la sintassi dei modelli di Resource Manager.
- Per suggerimenti su come risolvere i comuni errori di distribuzione, vedere Risolvere errori comuni durante la distribuzione di risorse in Azure con Azure Resource Manager.
- Per informazioni sulla distribuzione di un modello che richiede un token di firma di accesso condiviso, vedere Distribuire un modello di Resource Manager privato con token di firma di accesso condiviso.