Vytvoření více instancí prostředků pomocí elementu copy

Dokončeno

Prostředky jste doposud deklarovali v seznamu prostředků v šabloně. Při nasazování tak získáte jednu instanci každé položky určené v seznamu prostředků. Někdy je vhodné vytvořit více instancí konkrétního prostředku. Můžete například chtít mít více podsítí ve virtuální síti.

Vezměte v úvahu následující otázky a body, když budete přemýšlet o vytváření mnoha instancí a iterování s konstruktory:

  • Potřebuji více než jednu kopii: V jednodušších scénářích možná ne. U komplikovanějších případů, jako jsou podsítě nebo virtuální počítače, budete možná muset zvážit, jestli potřebujete více kopií nějakého prostředku.
  • Jsem závislý na prostředku: Obvykle je Azure Resource Manager dobrý při zjišťování toho, co je potřeba vytvořit v jakém pořadí, aby odkazy v šabloně Azure Resource Manageru fungovaly. V některých situacích ale možná budete muset zadat objednávku.
  • Definujte schéma pojmenování: Chcete dát svým prostředkům smysluplné názvy. Z tohoto důvodu se spoléháte na parametry předávané v době nasazení. Když máte více kopií, je vhodné mít podrobnější kontrolu a vytvářet názvy na základě toho, ve které iteraci v sekvenci kopírování se právě nacházíte.
  • Konfigurace a řízení vytváření prostředků: Můžete chtít omezit, kolik prostředků se vytváří v produkčním prostředí. Můžete to udělat tak, že nakonfigurujete vytváření prostředků jako sériové nebo paralelní.
  • Kopírovat další typy: Prostředky nejsou jediná věc, kterou můžete vytvořit více kopií a iterovat. Ve skutečnosti můžete provádět to samé s vlastnostmi, proměnnými a výstupem.
  • Nadřazený-podřízený: Možná budete muset nakonfigurovat vztahy nadřazenosti a podřízenosti ve vašich prostředcích.

Vytvoření několika instancí

K uložení klávesových úhozů můžete použít opakovací konstruktory (smyčky). Pokud se to, co potřebujete, neustále opakuje, má to podobný název a typ a rozdíly jsou jen malé, mohlo by pro vás být přínosné využívat element copy.

Element copy je kousek kódu JSON, který lze používat u mnoha typů konstruktorů, jako jsou prostředky, vlastnosti, proměnné a výstup. Syntaxe elementu copy se skládá z klíčového slova copy a z pole jako hodnoty. Například: "copy": [].

Toto pole přebírá určitý počet elementů a každý element je objekt {} tvořený sadou vlastností. Co je to za vlastnosti závisí na typu konstruktoru, ve kterém se používají. Obvykle mají všechny konstruktory elementu copy jednu společnou vlastnost: count. Tato vlastnost určuje, kolik instancí určitého typu konstruktoru chcete. Většina konstruktorů také povoluje vlastnost name, která vám poskytuje odkaz, na který můžete odkazovat v jiných částech kódu. Ostatní použité vlastnosti jsou specifické pro konkrétní konstruktory.

Co zvolit?

Můžete se zeptat: "Pokud můžu použít copy prvek u mnoha typů konstruktorů, který mám zvolit a kdy, a můžu použít více typů v šabloně?"

Vše závisí na vašem případu použití. Iterace prostředků umožňuje vytvořit mnoho kopií určitého prostředku. Je vhodné ji použít například v případě, že potřebujete velký počet účtů úložiště. Iterace vlastností naproti tomu umožňuje vytvořit mnoho vlastností uvnitř jednoho prostředku. Ušetří vám to zadávání z klávesnice a čas a sami nejlépe víte, kde máte v šabloně opakující se části.

Element copy lze použít na mnoha místech v šabloně. Element copy můžete používat k vytváření mnoha prostředků, ale také k vytváření mnoha podobných proměnných v rámci stejné šablony.

Jak to funguje

Element copy funguje s příkazem copy, který se vyhodnocuje a nahrazuje. Nahrazení je výsledkem toho, co definujete v copy příkazu opakovaně, kolikrát jste v copy poli zadali pokyn.

Následující příklad ukazuje, jak může vypadat definice s příkazem copy:

"copy": [
  {
    "name": "dataDisks",
    "count": 2,
    "input": {
      "diskSizeGB": 1023,
      "lun": "[copyIndex('dataDisks')]",
      "createOption": "Empty"
    }
  }
]

Všimněte si položky count: 2. Hodnota 2 znamená, že chcete, aby se výše uvedený výraz rozšířil do dvou položek. Výsledkem je následující kód:

"dataDisks": [
{
  "lun": 0,
  "createOption": "Empty",
  "diskSizeGB": 1023
},
{
  "lun": 1,
  "createOption": "Empty",
  "diskSizeGB": 1023
}

Vidíte, že hodnota vlastnosti name se stala názvem vlastnosti a obsah vlastnosti input se stal opakovanou částí kódu JSON.

Poznámka:

Výraz copy a jeho výstup se liší podle toho, jaký typ výrazu se použije. Předchozí příklad poskytuje dobrou představu o tom, co se děje, když je výraz transformován na řadu opakujících se příkazů.

Pro kopírování existují omezení. V současnosti době je to limit 800 položek.

Důležité

Další informace o přesných omezeních najdete v tématu Iterace prostředků v šablonách ARM.

Řízení iterace

K dispozici jsou pomocné funkce, které vám pomůžou odkazovat na konkrétní indexy v daném poli. Funkce copyIndex() vrátí aktuální index. Například pro třetí opakovanou položku copyIndex() vrátí hodnotu 2. Syntaxe funkce copyIndex() vypadá jako následující kód:

copyIndex(loopName, offset)

Funkce copyIndex() má dva různé vstupní parametry: loopName a offset. Parametr offset je vždy volitelný a používá se pro posun od aktuálního indexu. Cokoli, co přidáte jako hodnotu offset, se přidá do aktuálního indexu. Pokud aktuální index vrátí 2 a jako posun zadáte 1, funkce copyIndex() vrátí 3.

Parametr loopName je volitelný nebo povinný v závislosti na tom, kde se používá. Je povinný, pokud se používá uvnitř konstruktoru properties, a je volitelný, pokud se používá v poli resources. Tady je příklad, kde je tento parametr povinný:

"properties": {
    "storageProfile": {
      "copy": [
        {
          "name": "dataDisks",
          "count": "[parameters('numberOfDataDisks')]",
          "input": {
            "diskSizeGB": 1023,
            "lun": "[copyIndex('dataDisks')]",
            "createOption": "Empty"
          }
        }
      ]
    }
}

Všimněte si, jak se copy element používá uvnitř konstruktoru properties a copyIndex() má parametr loopName zadaný jako copyIndex('dataDisks').

Tady je příklad, kde parametr loopName není povinný:

{
  "type": "Microsoft.Network/virtualNetworks",
  "apiVersion": "2018-04-01",
  "name": "[concat(parameters('vnetname'), copyIndex())]",
}

Znázorňuje deklarování prostředku. Funkce copyIndex() je volána bez parametrů, protože se používá v kontextu prostředku.

Konfigurace nasazení

Když použijete element copy pro prostředky, budete vytvářet spoustu podobných prostředků.

Někdy můžete chtít řídit způsob a pořadí vytváření prostředků. Důvody pro řízení pořadí mohou být následující:

  • Omezení prostředí: Podle toho, do jakého prostředí nasazujete, může být vhodné omezit, jak moc bude toto prostředí ovlivněno určitým nasazením. V provozním prostředí je vhodné omezit, kolik prostředků je ovlivněno v každém jednotlivém okamžiku. Můžete nakonfigurovat režim nasazení k řízení počtu souběžně nasazovaných prostředků.
  • Závislosti: Mohli byste být závislí na něčem, co už existuje, abyste mohli vytvořit prostředek, který potřebujete. Pro vyjádření takové závislosti existujte konstruktor s názvem dependsOn.

Režimy nasazení a copy

Možná budete chtít zajistit, aby se před vytvořením něčeho dalšího vytvořila pomocí konstruktoru copy určitá sada prostředků. V takovém případě musíte tuto situaci vyjádřit. Nezapomínejte, že v tomto případě vstupuje do hry režim nasazení, který používá Resource Manager. Podporovány jsou dva režimy:

  • Sériový: Nastavení prostředků do tohoto režimu znamená, že se prostředky budou vytvářet postupně jeden po druhém. V tomto režimu se také očekává, že nastavením vlastnosti batchSize určíte, kolik prostředků se pomocí tohoto režimu nasadí. Novou dávku nelze spustit před dokončením předchozí dávky. Možná budete chtít nastavit takové omezení například v provozním prostředí, kde může být důležité omezit počet ovlivněných prostředků v některém okamžiku.
  • Paralelní: Tento režim je výchozím režimem nasazování. Výhodou je vysoká propustnost, takže zpracování šablony je rychlejší. Nevýhodou je, že nemůžete zaručit pořadí. To nemusí být vhodné v provozním prostředí.

Závislosti

V kontextu elementu copy je potřeba sdělit prostředku se závislostí, na jaký oddíl čeká. Tuto závislost vytvoříte odkazem na název pomocí následujícího kódu JSON:

"resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-04-01",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2015-06-15",
      "name": "[concat('VM', uniqueString(resourceGroup().id))]",
      "dependsOn": ["storagecopy"],
    }
  ]

Všimněte si, že element copy má vlastnost name s hodnotou storagecopy. Závislý prostředek (účet úložiště) čeká na dokončení operace elementu copy. To je vyjádřeno zápisem "dependsOn": ["storagecopy"].

Šablona ARM se mezi těmito dvěma prostředky proto přepne do režimu sériového nasazení. To může mít vliv na propustnost nasazování. Vyjádřili jste však, že vám záleží na určitém pořadí nasazování, které teď bude upřednostněno.