Řízení pořadí nasazování určením závislostí

Dokončeno

Můžete například chtít nasadit sadu prostředků do Azure, ale jenom v případě, když už bude nasazený jiný prostředek. V takovém případě je v šabloně potřeba komunikovat, že jeden prostředek závisí na jiném prostředku.

Je potřeba zvážit několik aspektů:

  • Před nasazením něčeho dalšího musí už něco existovat.

    Můžete například potřebovat trezor klíčů ve službě Azure Key Vault, abyste mohli získávat tajné kódy, které potřebujete načítat na virtuálním počítači. Když budete nasazovat trezor klíčů, můžete současně nasadit jeho tajný kód v rámci stejné šablony. Trezor klíčů je však nutné nasadit dřív než jeho tajný kód. Proto existence tajného kódu závisí na trezoru klíčů. Trezor klíčů a tajný kód se nasadí postupně jeden po druhém. Vzhledem k dané závislosti se nejprve nasadí trezor klíčů.

  • Můžu se spolehnout na fungování Azure Resource Manageru?

    Při kontrole, jestli existuje jiný prostředek, vás nejprve může napadnout použít Azure PowerShell nebo Azure CLI a zjistit tak existenci určitého prostředku. Řešení, které bude více automatizované, využívá integrovanou idempotenci Resource Manageru. Pokud Resource Manager zjistí prostředek definovaný v šabloně, který už existuje v cloudu, nebude ho znovu nasazovat. Aby tento přístup správně fungoval, musíte pochopit, jak Resource Manager tuto kontrolu provádí.

    Poznámka:

    Když se identity existujících prostředků shodují s něčím, co je definováno v šabloně, porovná Resource Manager vlastnosti. Pokud se vlastnosti přesně shodují, zachová se prostředek beze změny. Pokud se neshodují, modul provede změny a případně prostředek znovu nasadí.

  • Můžete vnořit prostředky v rámci jiného prostředku.

    V šablonách ARM můžete vnořit prostředky v rámci jiného prostředku. Vnořením prostředků definujete vztah mezi vnořenými prostředky a nadřazeným prostředkem.

Jak můžu definovat závislosti mezi prostředky Azure?

Představte si, že chcete zajistit, aby byl určitý prostředek (například účet úložiště) nasazen před prostředkem, který ho vyžaduje. Jak můžete zkontrolovat, jestli tento závislý účet úložiště existuje?

Můžete začít tím, že prozkoumáte aktuální stav nasazení spuštěním příkazů prostředí Azure PowerShell nebo Azure CLI a zjistíte, jestli tento účet úložiště existuje. Můžete se také podívat, jestli existuje nějaký konstruktor Resource Manageru, který vám umožní provést stejnou kontrolu.

V šablonách Resource Manageru takový konstruktor je. Jeho název je dependsOn. Tento konstruktor zajistí, že prostředky čekají, než se dokončí nasazování určeného prostředku.

Co je konstruktor dependsOn?

Je to pár klíč-hodnota, který umožňuje definovat pořadí nasazování prostředků. Někdy potřebujete zajistit, aby před nějakým prostředkem nejprve existoval jiný. Například může být potřeba, aby existovala databáze před aplikací nebo aby existoval prostředek tajného kódu před trezorem klíčů.

Umístěte konstruktor dependsOn na prostředek, který závisí na dalších prostředcích, které musí být nasazeny jako první. Určitý prostředek může záviset na více prostředcích, což je důvod, proč konstruktor očekává jako hodnotu seznam závislých prostředků.

Následující příklad ukazuje, jak můžete takovou závislost vyjádřit v kódu JSON v rámci šablony ARM:

"resources": [
  {
    "name": "<name of resource that needs to exist first>"
  },
  {
    "name": "someResource",
    "dependsOn": [
      "<name of resource that needs to exist first>"
    ]
  }
]

V tomto příkladu pomocí názvu prostředku určíte, na kterém prostředku závisíte. Mnoho prostředků však může mít stejný název. Abyste zajistili, že toto porovnání bude fungovat tak, jak chcete, můžete místo toho použít konstruktor resourceId() a získat jedinečný identifikátor prostředku:

"dependsOn": [
  "resourceId('Microsoft.Network/loadBalancers', variables('nameOfLoadBalancer')))"
]

Výše uvedený kód JSON vytvoří jedinečné ID kombinací oboru názvů, typu a názvu proměnné. Tímto způsobem zajistíte, že bude určen správný závislý prostředek.

Co jsou podřízené prostředky?

Podřízený prostředek je prostředek, který existuje pouze v kontextu jiného prostředku. Příkladem je rozšíření virtuálního počítače, které nemůže existovat bez virtuálního počítače.

Typický kód definující vztah nadřazenosti a podřízenosti v šabloně vypadá takto:

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "name": "child-resource"
    }]
  }
]

Tato závislost nadřazenosti a podřízenosti automaticky netvoří závislost, ve které je nadřazený prostředek nasazen dříve než podřízený prostředek. Takovou závislost musíte určit explicitně.

Pokud tedy takovou relaci vyjadřujete, nezapomeňte přidat dependsOn konstruktor, například následující:

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "dependsOn": ["parent-resource"],
      "name": "child resource"
    }]
  }
]