Sdílet prostřednictvím


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. Například před nasazením databáze potřebujete logický SQL server. Tento vztah vytvoříte tak, že označíte jeden prostředek jako závislý na druhém prostředku. Pomocí elementu dependsOn definujte explicitní závislost. K definování implicitní závislosti použijte odkazy nebo funkce seznamu.

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

Tip

Doporučujeme Bicep, protože nabízí stejné možnosti jako šablony ARM a syntaxe se snadněji používá. Další informace najdete v tématu Závislosti prostředků.

dependsOn

V rámci šablony Azure Resource Manageru (šablona ARM) dependsOn umožňuje prvek definovat jeden prostředek jako závislý na jednom nebo více prostředcích. Jeho hodnota je pole JSON (JavaScript Object Notation) řetězců, z nichž každý je název prostředku nebo ID. Pole může zahrnovat prostředky, které jsou podmíněně nasazeny. Pokud není podmíněný prostředek 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'))]"
  ],
  ...
}

V jazyceVersion 2.0 použijte symbolický název prostředku v dependsOn polích. 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 sklon dependsOn k mapování vztahů mezi prostředky, je důležité pochopit, proč to děláte. Pokud chcete například zdokumentovat, 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é umožňují zobrazit závislosti. Nastavení nepotřebných závislostí zpomaluje dobu nasazení, protože Resource Manager nemůže tyto prostředky nasadit paralelně.

Podřízené prostředky

Mezi podřízeným prostředkem 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ý sql server 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ým serverem.

"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 šabloně 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ázvů JSON a hodnot nebo 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, nikoli ID prostředku. Pokud předáte ID prostředku do funkcí odkazu nebo seznamu, 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 referenční funkci.

Závisí 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 buď 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 ve smyčce kopírování. Závisí pouze na celé smyčce, pokud před vytvořením dalšího prostředku potřebujete všechny prostředky ve smyčce existovat. Nastavení závislosti na celé smyčce způsobí, že se graf závislostí výrazně rozšíří, zejména pokud tyto smyčkované prostředky závisí 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 smyčky kopírování, všechny prostředky ve smyčce se přidají jako závislosti. Předchozí ukázku je možné napsat jako následující json. V ukázce závisí virtuální počítač 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 zobrazí chyba cyklických závislostí, vyhodnoťte šablonu a zjistěte, jestli je možné odebrat nějaké závislosti. Pokud odebrání závislostí nefunguje, můžete se vyhnout cyklických závislostí 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 u každého 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 1 závisí na virtuálním počítači 1 a vm2. Rozšíření nastaví hodnoty na virtuálním počítači vm1, které získá z virtuálního počítače vm2.
  4. Rozšíření na virtuálním počítači vm2 závisí na virtuálním počítači 1 a vm2. Rozšíření nastaví hodnoty na virtuálním počítači vm2, které získá z virtuálního počítače 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 pomocí Azure Resource Manageru.

Další kroky