Condividi tramite


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