Definire l'ordine per la distribuzione delle risorse nei modelli di Azure Resource ManagerDefine the order for deploying resources in Azure Resource Manager Templates

Perché una risorsa possa essere distribuita, potrebbe essere necessario che prima di essa esistano altre risorse specifiche.For a given resource, there can be other resources that must exist before the resource is deployed. Ad esempio, un server SQL deve esistere prima che si tenti di distribuire un database SQL.For example, a SQL server must exist before attempting to deploy a SQL database. Per definire questa relazione, si contrassegna una risorsa come dipendente dall'altra risorsa.You define this relationship by marking one resource as dependent on the other resource. Una dipendenza viene definita con l'elemento dependsOn oppure con la funzione reference.You define a dependency with the dependsOn element, or by using the reference function.

Resource Manager valuta le dipendenze tra le risorse e le distribuisce in base all'ordine di dipendenza.Resource Manager evaluates the dependencies between resources, and deploys them in their dependent order. Quando le risorse non sono interdipendenti, Resource Manager le distribuisce in parallelo.When resources aren't dependent on each other, Resource Manager deploys them in parallel. La definizione delle dipendenze è necessaria solo per le risorse distribuite nello stesso modello.You only need to define dependencies for resources that are deployed in the same template.

Per un'esercitazione, vedere Esercitazione: Creare modelli di Azure Resource Manager con risorse dipendenti.For a tutorial, see Tutorial: create Azure Resource Manager templates with dependent resources.

dependsOndependsOn

All'interno del modello, l'elemento dependsOn consente di definire una risorsa come dipendente da una o più risorse.Within your template, the dependsOn element enables you to define one resource as a dependent on one or more resources. Il valore può essere un elenco delimitato da virgole di nomi di risorse.Its value can be a comma-separated list of resource names.

L'esempio seguente illustra un set di scalabilità di macchine virtuali dipendente da un servizio di bilanciamento del carico e da una rete virtuale. L'esempio illustra anche un ciclo che crea più account di archiviazione.The following example shows a virtual machine scale set that depends on a load balancer, virtual network, and a loop that creates multiple storage accounts. Queste altre risorse non sono visualizzate nell'esempio seguente, ma devono esistere in un altro punto del modello.These other resources aren't shown in the following example, but they would need to exist elsewhere in the template.

{
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "name": "[variables('namingInfix')]",
  "location": "[variables('location')]",
  "apiVersion": "2016-03-30",
  "tags": {
    "displayName": "VMScaleSet"
  },
  "dependsOn": [
    "[variables('loadBalancerName')]",
    "[variables('virtualNetworkName')]",
    "storageLoop",
  ],
  ...
}

Nell'esempio precedente è inclusa una dipendenza per le risorse create tramite il ciclo di copia denominato storageLoop.In the preceding example, a dependency is included on the resources that are created through a copy loop named storageLoop. Per avere un esempio, vedere Creare più istanze di risorse in Gestione risorse di Azure.For an example, see Create multiple instances of resources in Azure Resource Manager.

Quando si definiscono le dipendenze, per evitare ambiguità è possibile includere lo spazio dei nomi del provider di risorse e il tipo di risorsa.When defining dependencies, you can include the resource provider namespace and resource type to avoid ambiguity. Ad esempio, per distinguere un bilanciamento del carico e una rete virtuale che hanno lo stesso nome di altre risorse, usare il formato seguente:For example, to clarify a load balancer and virtual network that may have the same names as other resources, use the following format:

"dependsOn": [
  "[resourceId('Microsoft.Network/loadBalancers', variables('loadBalancerName'))]",
  "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]"
]

Anche se si potrebbe essere propensi a usare dependsOn per mappare le relazioni tra le risorse, è importante comprendere il motivo per cui si esegue tale operazione.While you may be inclined to use dependsOn to map relationships between your resources, it's important to understand why you're doing it. Per documentare la modalità di interconnessione delle risorse, dependsOn non rappresenta l'approccio corretto.For example, to document how resources are interconnected, dependsOn isn't the right approach. Non è possibile eseguire query per ottenere le risorse definite nell'elemento dependsOn dopo la distribuzione.You can't query which resources were defined in the dependsOn element after deployment. L'uso di dependsOn potrebbe influire sul tempo necessario per la distribuzione, perché Resource Manager non esegue la distribuzione simultanea in parallelo di due risorse con dipendenza.By using dependsOn, you potentially impact deployment time because Resource Manager doesn't deploy in parallel two resources that have a dependency.

Risorse figlioChild resources

La proprietà delle risorse consente di specificare le risorse figlio correlate alla risorsa definita.The resources property allows you to specify child resources that are related to the resource being defined. Le risorse figlio possono essere solo definite da cinque livelli.Child resources can only be defined five levels deep. È importante notare che tra una risorsa figlio e la risorsa padre non viene creata una dipendenza implicita.It's important to note that an implicit dependency isn't created between a child resource and the parent resource. Se è necessario che la risorsa figlio sia distribuita dopo la risorsa padre, è necessario dichiarare in modo esplicito tale dipendenza con la proprietà dependsOn.If you need the child resource to be deployed after the parent resource, you must explicitly state that dependency with the dependsOn property.

Ogni risorsa padre accetta solo determinati tipi di risorse come risorse figlio.Each parent resource accepts only certain resource types as child resources. I tipi di risorse accettate sono specificati nel schema del modello della risorsa padre.The accepted resource types are specified in the template schema of the parent resource. Il nome del tipo di risorsa figlio include il nome del tipo di risorsa padre, ad esempio Microsoft.Web/sites/config e Microsoft.Web/sites/extensions sono entrambi risorse figlio di Microsoft.Web/sites.The name of child resource type includes the name of the parent resource type, such as Microsoft.Web/sites/config and Microsoft.Web/sites/extensions are both child resources of the Microsoft.Web/sites.

Nell'esempio seguente sono illustrati un server SQL e un database SQL.The following example shows a SQL server and SQL database. Si noti che viene definita una dipendenza esplicita tra il database SQL e il server SQL, anche se il database è un elemento figlio del server.Notice that an explicit dependency is defined between the SQL database and SQL server, even though the database is a child of the server.

"resources": [
  {
    "name": "[variables('sqlserverName')]",
    "type": "Microsoft.Sql/servers",
    "location": "[resourceGroup().location]",
    "tags": {
      "displayName": "SqlServer"
    },
    "apiVersion": "2014-04-01-preview",
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "name": "[parameters('databaseName')]",
        "type": "databases",
        "location": "[resourceGroup().location]",
        "tags": {
          "displayName": "Database"
        },
        "apiVersion": "2014-04-01-preview",
        "dependsOn": [
          "[variables('sqlserverName')]"
        ],
        "properties": {
          "edition": "[parameters('edition')]",
          "collation": "[parameters('collation')]",
          "maxSizeBytes": "[parameters('maxSizeBytes')]",
          "requestedServiceObjectiveName": "[parameters('requestedServiceObjectiveName')]"
        }
      }
    ]
  }
]

funzioni reference e listreference and list functions

La funzione di riferimento consente un'espressione per derivare il valore da altri nomi JSON e coppie valore o risorse di runtime.The reference function enables an expression to derive its value from other JSON name and value pairs or runtime resources. Le funzioni list* restituiscono valori per una risorsa da un'operazione elenco.The list* functions return values for a resource from a list operation. Le espressioni reference e list dichiarano in modo implicito l'interdipendenza tra due risorse, quando la risorsa di riferimento viene distribuita nello stesso modello e vi si fa riferimento tramite il nome, non tramite l'ID risorsa.Reference and list expressions implicitly declare that one resource depends on another, when the referenced resource is deployed in the same template and referred to by its name (not resource ID). Se alla funzione reference o list viene passato l'ID risorsa, non viene creato alcun riferimento implicito.If you pass the resource ID into the reference or list functions, an implicit reference isn't created.

Il formato generale della funzione reference è:The general format of the reference function is:

reference('resourceName').propertyPath

Il formato generale della funzione listKeys è:The general format of the listKeys function is:

listKeys('resourceName', 'yyyy-mm-dd')

Nell'esempio seguente, un endpoint della rete CDN dipende in modo esplicito dal profilo CDN e in modo implicito da un'app Web.In the following example, a CDN endpoint explicitly depends on the CDN profile, and implicitly depends on a web app.

{
    "name": "[variables('endpointName')]",
    "type": "endpoints",
    "location": "[resourceGroup().location]",
    "apiVersion": "2016-04-02",
    "dependsOn": [
            "[variables('profileName')]"
    ],
    "properties": {
        "originHostHeader": "[reference(variables('webAppName')).hostNames[0]]",
        ...
    }

Per specificare le dipendenze, è possibile usare questo elemento o l'elemento dependsOn, ma non è necessario usarli entrambi per la stessa risorsa dipendente.You can use either this element or the dependsOn element to specify dependencies, but you don't need to use both for the same dependent resource. Quando possibile, usare un riferimento implicito per evitare di aggiungere una dipendenza non necessaria.Whenever possible, use an implicit reference to avoid adding an unnecessary dependency.

Per altre informazioni, vedere la funzione del riferimento.To learn more, see reference function.

Raccomandazioni per l'impostazione delle dipendenzeRecommendations for setting dependencies

Quando si decidono le dipendenze da impostare, usare le linee guida seguenti:When deciding what dependencies to set, use the following guidelines:

  • Impostare il minor numero possibile di dipendenze.Set as few dependencies as possible.
  • Impostare una risorsa figlio come dipendente dalla risorsa padre.Set a child resource as dependent on its parent resource.
  • Usare la funzione reference passando il nome della risorsa per impostare dipendenze implicite tra risorse che devono condividere una proprietà.Use the reference function and pass in the resource name to set implicit dependencies between resources that need to share a property. Non aggiungere una dipendenza esplicita (dependsOn) quando è già stata definita una dipendenza implicita.Don't add an explicit dependency (dependsOn) when you've already defined an implicit dependency. Questo approccio riduce il rischio di creare dipendenze non necessarie.This approach reduces the risk of having unnecessary dependencies.
  • Impostare una dipendenza quando una risorsa non può essere creata senza le funzionalità di un'altra risorsa.Set a dependency when a resource can't be created without functionality from another resource. Non impostare una dipendenza se le risorse interagiscono solo dopo la distribuzione.Don't set a dependency if the resources only interact after deployment.
  • Consentire la propagazione a catena delle dipendenze senza impostarle esplicitamente.Let dependencies cascade without setting them explicitly. Ad esempio, una macchina virtuale dipende da un'interfaccia di rete virtuale e tale interfaccia dipende da una rete virtuale e indirizzi IP pubblici.For example, your virtual machine depends on a virtual network interface, and the virtual network interface depends on a virtual network and public IP addresses. La macchina virtuale viene quindi distribuita dopo tutte e tre le risorse, ma non deve essere impostata esplicitamente come dipendente da tutte e tre.Therefore, the virtual machine is deployed after all three resources, but don't explicitly set the virtual machine as dependent on all three resources. Questo approccio offre chiarezza nell'ordine delle dipendenze e semplifica la successiva modifica del modello.This approach clarifies the dependency order and makes it easier to change the template later.
  • Se un valore può essere determinato prima della distribuzione, provare a distribuire le risorse senza una dipendenza.If a value can be determined before deployment, try deploying the resource without a dependency. Se un valore di configurazione richiede il nome di un'altra risorsa, ad esempio, potrebbe non essere necessaria una dipendenza.For example, if a configuration value needs the name of another resource, you might not need a dependency. Questa indicazione non è sempre valida perché alcune risorse verificano l'esistenza dell'altra risorsa.This guidance doesn't always work because some resources verify the existence of the other resource. Se viene visualizzato un errore, aggiungere una dipendenza.If you receive an error, add a dependency.

Resource Manager identifica le dipendenze circolari durante la convalida del modello.Resource Manager identifies circular dependencies during template validation. Se viene visualizzato un errore che indica la presenza di una dipendenza circolare, valutare il modello per verificare se esistono dipendenze non necessarie che possono essere rimosse.If you receive an error stating that a circular dependency exists, evaluate your template to see if any dependencies aren't needed and can be removed. Se la rimozione delle dipendenze non è applicabile, è possibile evitare dipendenze circolari spostando alcune operazioni di distribuzione in risorse figlio distribuite dopo le risorse che hanno la dipendenza circolare.If removing dependencies doesn't work, you can avoid circular dependencies by moving some deployment operations into child resources that are deployed after the resources that have the circular dependency. Si supponga, ad esempio, di distribuire due macchine virtuali e che sia necessario impostare in ognuna proprietà che fanno riferimento all'altra.For example, suppose you're deploying two virtual machines but you must set properties on each one that refer to the other. È possibile eseguire la distribuzione nell'ordine seguente:You can deploy them in the following order:

  1. VM 1vm1
  2. VM 2vm2
  3. L'estensione in VM 1 dipende da VM 1 e VM 2.Extension on vm1 depends on vm1 and vm2. L'estensione imposta in VM 1 valori ottenuti da VM 2.The extension sets values on vm1 that it gets from vm2.
  4. L'estensione in VM 2 dipende da VM 1 e VM 2.Extension on vm2 depends on vm1 and vm2. L'estensione imposta in VM 2 valori ottenuti da VM 1.The extension sets values on vm2 that it gets from vm1.

Per informazioni sulla valutazione dell'ordine di distribuzione e la risoluzione degli errori di dipendenza, vedere Risolvere errori comuni durante la distribuzione di risorse in Azure con Azure Resource Manager.For information about assessing the deployment order and resolving dependency errors, see Troubleshoot common Azure deployment errors with Azure Resource Manager.

Passaggi successiviNext steps