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 are not 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.

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 are not 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": [
  "[concat('Microsoft.Network/loadBalancers/', variables('loadBalancerName'))]",
  "[concat('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. Ad esempio, per documentare come le risorse sono interconnesse, dependsOn non è l'approccio giusto.For example, to document how resources are interconnected, dependsOn is not the right approach. Non è possibile eseguire query su quali risorse sono state definite nell'elemento dependsOn dopo la distribuzione.You cannot 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 di due risorse con dipendenza.By using dependsOn, you potentially impact deployment time because Resource Manager does not deploy in parallel two resources that have a dependency. Per documentare le relazioni tra le risorse, usare il collegamento di risorse.To document relationships between resources, instead use resource linking.

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 una relazione implicita non viene creata tra una risorsa figlio e la risorsa padre.It is important to note that an implicit dependency is not 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')]"
        }
      }
    ]
  }
]

funzione di riferimentoreference function

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 Espressioni di riferimento in modo implicito dichiarano che una risorsa dipende da un altro.Reference expressions implicitly declare that one resource depends on another. Il formato generale è il seguente:The general format is:

reference('resourceName').propertyPath

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]]",
        ...
    }

È possibile utilizzare questo elemento o l'elemento dependsOn per specificare le dipendenze, ma non è necessario utilizzare entrambi per la stessa risorsa dipendente.You can use either this element or the dependsOn element to specify dependencies, but you do not 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 per impostare dipendenze implicite tra le risorse che devono condividere una proprietà.Use the reference function 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.Do not add an explicit dependency (dependsOn) when you have 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 cannot be created without functionality from another resource. Non impostare una dipendenza se le risorse interagiscono solo dopo la distribuzione.Do not 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 esse.Therefore, the virtual machine is deployed after all three resources, but do not 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 does not 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 are not needed and can be removed. Se la rimozione delle dipendenze non è applicabile, è possibile evitare le dipendenze circolari spostando alcune operazioni di distribuzione in risorse figlio distribuite dopo le risorse che hanno la dipendenza circolare.If removing dependencies does not 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 are 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