Definire l'ordine per la distribuzione delle risorse nei modelli ARMDefine the order for deploying resources in ARM templates

Quando si distribuisce una risorsa, potrebbe essere necessario assicurarsi che siano presenti altre risorse prima della distribuzione.When deploying a resource, you may need to make sure other resources exist before it's deployed. Ad esempio, è necessario un server SQL logico prima di distribuire un database.For example, you need a logical SQL server before deploying a 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.

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 è una matrice JSON di stringhe, ognuna delle quali è un nome di risorsa.Its value is a JSON array of strings, each of which is a resource name. La matrice può includere risorse distribuite in modo condizionale.The array can include resources that are conditionally deployed. Quando una risorsa condizionale non viene distribuita, Azure Resource Manager la rimuove automaticamente dalle dipendenze richieste.When a conditional resource isn't deployed, Azure Resource Manager automatically removes it from the required dependencies.

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",
  "apiVersion": "2016-03-30",
  "name": "[variables('namingInfix')]",
  "location": "[variables('location')]",
  "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 una dipendenza di distribuzione implicita non viene creata tra una risorsa figlio e la risorsa padre.It's important to note that an implicit deployment 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 vengono illustrati un server e un database SQL logici.The following example shows a logical SQL server and database. Si noti che viene definita una dipendenza esplicita tra il database e il server, anche se il database è un figlio del server.Notice that an explicit dependency is defined between the database and the server, even though the database is a child of the server.

"resources": [
  {
    "name": "[variables('sqlserverName')]",
    "apiVersion": "2014-04-01-preview",
    "type": "Microsoft.Sql/servers",
    "location": "[resourceGroup().location]",
    "tags": {
      "displayName": "SqlServer"
    },
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "name": "[parameters('databaseName')]",
        "apiVersion": "2014-04-01-preview",
        "type": "databases",
        "location": "[resourceGroup().location]",
        "dependsOn": [
          "[variables('sqlserverName')]"
        ],
        "tags": {
          "displayName": "Database"
        },
        "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')]",
    "apiVersion": "2016-04-02",
    "type": "endpoints",
    "location": "[resourceGroup().location]",
    "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.

Dipendenze circolariCircular dependencies

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