Definování pořadí nasazování prostředků v šablonách ARM

Při nasazování prostředků možná budete muset zajistit, aby některé prostředky existovaly před jinými prostředky. Před nasazením databáze potřebujete například logický SQL server. Tento vztah vytvoříte tak, že jeden prostředek označíte jako závislý na druhém prostředku. Pomocí elementu dependsOn definujte explicitní závislost. K definování implicitní závislosti použijte funkce odkazu nebo seznamu .

Azure Resource Manager vyhodnocuje závislosti mezi prostředky a nasazuje je v závislém pořadí. Pokud na sobě prostředky nezávisí, Resource Manager je nasadí paralelně. Stačí definovat závislosti pro prostředky, které jsou nasazené ve stejné šabloně.

Tip

Doporučujeme Bicep , protože nabízí stejné funkce jako šablony ARM a jeho použití je jednodušší. Další informace najdete v tématu Závislosti prostředků.

dependsOn

V rámci šablony Azure Resource Manager (šablona ARM) dependsOn umožňuje element definovat jeden prostředek jako závislý na jednom nebo více prostředcích. Jeho hodnotou je pole řetězců JSON (JavaScript Object Notation), z nichž každý představuje název prostředku nebo ID. Pole může obsahovat prostředky, které jsou nasazené podmíněně. Pokud podmíněný prostředek není nasazený, Azure Resource Manager ho automaticky odebere z požadovaných závislostí.

Následující příklad ukazuje síťové rozhraní, které závisí na virtuální síti, skupině zabezpečení sítě a veřejné IP adrese. Úplnou šablonu najdete v šabloně rychlého startu pro virtuální počítač s Linuxem.

{
  "type": "Microsoft.Network/networkInterfaces",
  "apiVersion": "2022-07-01",
  "name": "[variables('networkInterfaceName')]",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[resourceId('Microsoft.Network/networkSecurityGroups/', parameters('networkSecurityGroupName'))]",
    "[resourceId('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]",
    "[resourceId('Microsoft.Network/publicIpAddresses/', variables('publicIpAddressName'))]"
  ],
  ...
}

U languageVersion 2.0 použijte v dependsOn polích symbolický název prostředku. Příklad:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": {
    "myStorage": {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[format('storage{0}', uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2"
    },
    "myVm": {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2023-03-01",
      "name": "[format('vm{0}', uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "myStorage"
      ],
      ...
    }
  }
}

I když můžete mít tendenci mapovat dependsOn vztahy mezi prostředky, je důležité pochopit, proč to děláte. Například dokumentovat, jak jsou prostředky vzájemně propojené, dependsOn není správný přístup. Po nasazení prostředek nezachovává závislosti nasazení ve svých vlastnostech, takže neexistují žádné příkazy ani operace, které by vám umožnily zobrazit závislosti. Nastavení nepotřebných závislostí zpomalí dobu nasazení, protože Resource Manager tyto prostředky nemůžou nasadit paralelně.

Podřízené prostředky

Mezi podřízeným a nadřazeným prostředkem se automaticky nevytvoří implicitní závislost nasazení. Pokud potřebujete nasadit podřízený prostředek za nadřazený prostředek, nastavte dependsOn vlastnost .

Následující příklad ukazuje logický server SQL a databázi. Všimněte si, že mezi databází a serverem je definována explicitní závislost, i když je databáze podřízená serveru.

"resources": [
  {
    "type": "Microsoft.Sql/servers",
    "apiVersion": "2022-05-01-preview",
    "name": "[parameters('serverName')]",
    "location": "[parameters('location')]",
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "type": "databases",
        "apiVersion": "2022-05-01-preview",
        "name": "[parameters('sqlDBName')]",
        "location": "[parameters('location')]",
        "sku": {
          "name": "Standard",
          "tier": "Standard"
          },
        "dependsOn": [
          "[resourceId('Microsoft.Sql/servers', parameters('serverName'))]"
        ]
      }
    ]
  }
]

Úplnou šablonu najdete v tématu Šablona rychlého startu pro Azure SQL Database.

Odkazy a funkce seznamu

Referenční funkce umožňuje výrazu odvodit jeho hodnotu z jiných dvojic název a hodnota JSON nebo z prostředků modulu runtime. Funkce list* vrací hodnoty pro prostředek z operace seznamu.

Výrazy odkazů a seznamů implicitně deklarují, že jeden prostředek závisí na jiném. Pokud je to možné, použijte implicitní odkaz, abyste se vyhnuli přidání zbytečné závislosti.

Pokud chcete vynutit implicitní závislost, odkazujte na prostředek podle názvu, ne podle ID prostředku. Pokud předáte ID prostředku do funkcí odkazu nebo výpisu, implicitní odkaz se nevytvořil.

Obecný formát reference funkce je:

reference('resourceName').propertyPath

Obecný formát listKeys funkce je:

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

V následujícím příkladu koncový bod CDN explicitně závisí na profilu CDN a implicitně závisí na webové aplikaci.

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

Další informace najdete v tématu Referenční funkce.

Závislost na prostředcích ve smyčce

Pokud chcete nasadit prostředky, které závisí na prostředcích ve smyčce kopírování, máte dvě možnosti. Můžete nastavit závislost na jednotlivých prostředcích ve smyčce nebo na celé smyčce.

Poznámka

Ve většině scénářů byste měli nastavit závislost na jednotlivých prostředcích v rámci smyčky kopírování. Na celé smyčce závisí pouze v případech, kdy před vytvořením dalšího prostředku potřebujete, aby existovaly všechny prostředky ve smyčce. Nastavení závislosti na celé smyčce způsobí, že se graf závislostí výrazně rozšíří, zejména pokud tyto prostředky ve smyčce závisejí na jiných prostředcích. Rozšířené závislosti ztěžují efektivní dokončení nasazení.

Následující příklad ukazuje, jak nasadit více virtuálních počítačů. Šablona vytvoří stejný počet síťových rozhraní. Každý virtuální počítač je závislý na jednom síťovém rozhraní, nikoli na celé smyčce.

{
  "type": "Microsoft.Network/networkInterfaces",
  "apiVersion": "2022-07-01",
  "name": "[format('{0}-{1}', variables('nicPrefix'), copyIndex())]",
  "location": "[parameters('location')]",
  "copy": {
    "name": "nicCopy",
    "count": "[parameters('vmCount')]"
  },
  ...
},
{
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2022-11-01",
  "name": "[format('{0}{1}', variables('vmPrefix'), copyIndex())]",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[resourceId('Microsoft.Network/networkInterfaces',format('{0}-{1}', variables('nicPrefix'),copyIndex()))]"
  ],
  "copy": {
    "name": "vmCopy",
    "count": "[parameters('vmCount')]"
  },
  "properties": {
    "networkProfile": {
      "networkInterfaces": [
        {
          "id": "[resourceId('Microsoft.Network/networkInterfaces',format('(0)-(1)', variables('nicPrefix'), copyIndex()))]",
          "properties": {
            "primary": "true"
          }
        }
      ]
    },
    ...
  }
}

Následující příklad ukazuje, jak nasadit tři účty úložiště před nasazením virtuálního počítače. Všimněte si, že element je name nastavený na storagecopy a dependsOn element pro virtuální počítač je také nastavený na storagecopy.copy

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}storage{1}, copyIndex(), uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2022-11-01",
      "name": "[format('VM{0}', uniqueString(resourceGroup().id))]",
      "dependsOn": ["storagecopy"],
      ...
    }
  ]
}

Symbolické názvy lze použít v dependsOn polích. Pokud je symbolický název pro smyčku kopírování, všechny prostředky ve smyčce se přidají jako závislosti. Předchozí ukázku je možné zapsat jako následující json. V ukázce závisí myVM na všech účtech úložiště ve smyčce myStorages .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": {
    "myStorages": {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}storage{1}, copyIndex(), uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    "myVM": {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2022-11-01",
      "name": "[format('VM{0}', uniqueString(resourceGroup().id))]",
      "dependsOn": ["myStorages"],
      ...
    }
  }
}

Cyklické závislosti

Resource Manager identifikuje cyklické závislosti během ověřování šablony. Pokud se u cyklických závislostí zobrazí chyba, vyhodnoťte šablonu a zjistěte, jestli je možné odebrat nějaké závislosti. Pokud odebrání závislostí nefunguje, můžete se cyklických závislostí vyhnout přesunutím některých operací nasazení do podřízených prostředků. Nasaďte podřízené prostředky za prostředky, které mají cyklický závislost. Předpokládejme například, že nasazujete dva virtuální počítače, ale na každém z nich musíte nastavit vlastnosti, které odkazují na druhý. Můžete je nasadit v následujícím pořadí:

  1. vm1
  2. vm2
  3. Rozšíření na virtuálním počítači vm1 závisí na virtuálních počítačích vm1 a vm2. Rozšíření nastaví na vm1 hodnoty, které získá z vm2.
  4. Rozšíření na virtuálním počítači vm2 závisí na virtuálních počítačích vm1 a vm2. Rozšíření nastaví na vm2 hodnoty, které získá z vm1.

Informace o posouzení pořadí nasazení a řešení chyb závislostí najdete v tématu Řešení běžných chyb nasazení Azure s využitím Azure Resource Manager.

Další kroky