Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 di modello ARM 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 di una risorsa distribuita nella sottoscrizione.
Ad esempio, per ottenere l'ID risorsa per una definizione di politica implementata 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 di 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 al modo in cui si specifica il modello. Quando si collega a un modello esterno, le funzioni si risolvono sempre nell'ambito di tale modello. Quando si annida un modello all'interno di un modello padre, usare la expressionEvaluationOptions
proprietà per specificare se le funzioni vengono risolte nel gruppo di risorse e nella sottoscrizione per il modello padre o il modello annidato. Impostare la proprietà su inner
per definire l'ambito per il modello annidato. Impostare la proprietà su outer
per determinare l'ambito del modello padre.
Nella tabella seguente viene illustrato se le funzioni si riferiscono al gruppo di risorse padre o incorporato e all'abbonamento.
Tipo di modello | Ambito | Risoluzione |
---|---|---|
annidato | outer (impostazione predefinita) | Gruppo di risorse padre |
annidato | interno | Sottogruppo di risorse |
collegato | Non disponibile | Sottogruppo di risorse |
Il modello di esempio seguente mostra:
- modello annidato con ambito predefinito (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 sulla risoluzione degli errori di distribuzione comuni, vedere Risolvere gli errori comuni di distribuzione di 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.