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í:
- vm1
- vm2
- 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.
- 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
- Pokud chcete projít kurz, projděte si Kurz: Vytváření šablon ARM se závislými prostředky.
- Modul Learn, který se zabývá závislostmi prostředků, najdete v tématu Správa složitých cloudových nasazení pomocí pokročilých funkcí šablon ARM.
- Doporučení k nastavení závislostí najdete v tématu Osvědčené postupy pro šablony ARM.
- Další informace o řešení potíží se závislostmi během nasazování najdete v tématu Řešení běžných chyb nasazení Azure s využitím Azure Resource Manager.
- Další informace o vytváření šablon Azure Resource Manager najdete v tématu Vysvětlení struktury a syntaxe šablon ARM.
- Seznam dostupných funkcí v šabloně najdete v tématu Funkce šablony ARM.