Több erőforráspéldány létrehozása a copy elem használatával

Befejeződött

Az eddigiekben egy sablon erőforráslistájában deklarált erőforrásokat. Az üzembe helyezéssel végül az erőforráslista minden elemének egyetlen példányát kapja meg. Célszerű lehet egy adott erőforrás több példányát is létrehozni. Lehetséges például, hogy több alhálózatra van szüksége egy virtuális hálózatban.

Ha több példányt szeretne, és több szerkezeten szeretne iterálást végezni, vegye figyelembe az alábbi szempontokat és kérdéseket:

  • Több példányra van szükségem: Egyszerűbb forgatókönyvek esetén előfordulhat, hogy nem. Összetettebb, alhálózatokat és virtuális gépeket is magában foglaló forgatókönyvekhez érdemes lehet mérlegelni, hogy szükség van-e valamiből több példányra.
  • Erőforrástól függek: Az Azure Resource Manager általában jó megoldás arra, hogy kitalálja, milyen sorrendben kell összeállítani, hogy az Azure Resource Manager-sablonban található hivatkozások működjenek. Vannak azonban olyan helyzetek, amikor szükség lehet a megrendelés megadására.
  • Elnevezési séma definiálása: Az erőforrásoknak értelmes neveket szeretne adni. Ezt az üzembe helyezéskor átadott paraméterekkel biztosíthatja. Több példány esetén érdemes közvetlenebbül szabályozni az elnevezéseket az alapján, hogy melyik iterációnál tart éppen a másolási sorozat.
  • Erőforrás-létrehozás konfigurálása és szabályozása: Előfordulhat, hogy korlátozni szeretné, hogy hány erőforrás jön létre éles környezetben. Ez az erőforrások létrehozásának serial (soros) vagy parallel (párhuzamos) konfigurálásával érhető el.
  • Más típusú másolás: Az erőforrások nem az egyetlen dolog, amelyből több példányt hozhat létre, és átmásolhatja azokat. Ugyanezt tulajdonságokkal, változókkal és kimenetekkel is megteheti.
  • Szülő-gyermek: Előfordulhat, hogy konfigurálnia kell a szülő-gyermek kapcsolatokat az erőforrásokban.

Több példány létrehozása

Szerkezetek hurkolásával munkát spórolhat meg. Ha az elvégzendő tevékenység hasonló névvel és típussal, csekély eltérésekkel újra és újra megismétlődik, akkor ajánlott a copy elemet használni.

A copy elem egy kis JSON-kód, amely sokféle szerkezethez, például erőforrásokhoz, tulajdonságokhoz, változókhoz és kimenetekhez is használható. A copy elem szintaxisa a copy kulcsszóból és egy tömbértékből áll. For example: "copy": [].

A tömbnek több eleme lehet, és minden eleme egy tulajdonságokból álló {} objektum. Hogy melyek ezek a tulajdonságok, az attól függ, hogy milyen típusú szerkezettel vannak használva. Általában a copy elem minden szerkezete rendelkezik egy count tulajdonsággal. Ez a tulajdonság adja meg, hogy egy bizonyos típusú erőforrás hány példányára van szükség. A szerkezetek többségéhez egy name (név) tulajdonság is megadható, amelyre a kód más részeiben lehet hivatkozni. Más használható tulajdonságok az adott szerkezetre jellemzők.

Mit válasszak?

Felteheti a kérdést: "Ha az elemet számos típusú szerkezeten használhatom copy , melyiket válasszam, és mikor, és használhatok-e több típust egy sablonban?"

Mindez az adott használati helyzettől függ. Erőforrás iterálásával egy erőforrás több példányát hozhatja létre. Ennek akkor van értelme, ha például sok tárfiókra van szüksége. Tulajdonságok iterálásával viszont sok tulajdonságot hozhat létre egy erőforráson belül. A lényeg, hogy gépelést és időt spórolhat meg, és Ön tudja legjobban, hol vannak ismétlődések a sablonban.

A sablonban számos helyen használhatja a copy elemet. copy elemmel sok erőforrást is létrehozhat, de létrehozhat sok hasonló változót is ugyanabban a sablonban.

Hogyan működik?

A copy elem úgy működik, hogy a rendszer kiértékeli és felülírja a copy utasítást. A csere annak az eredménye, amit az copy utasításban definiál, annyiszor ismétlődik, amennyit a copy mezőbe beutalt.

Az alábbi példa szemlélteti, hogyan fest egy copy elemet használó definíció:

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

Vessen egy pillantást a count: 2 bejegyzésre. A 2 érték azt jelenti, hogy a fenti kifejezést két bejegyzésre kell szétbontani. Az eredmény a következő:

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

A name tulajdonság értéke lett a tulajdonság neve, az input tulajdonság tartalma pedig az ismétlődő JSON-kód része lett.

Megjegyzés:

A copy kifejezés és annak kimenete a használt kifejezéstől függően különböző. A fenti példa jól szemlélteti, hogy mi történik egy kifejezés ismétlődő utasításokká alakítása során.

A másolatok száma korlátozott. A jelenlegi korlát 800 bejegyzés.

Fontos

További információ a pontos korlátozásokkal kapcsolatban: Erőforrás-iteráció az ARM-sablonokban.

Az iteráció vezérlése

Vannak segédfüggvények, amelyek segítenek a tömb adott indexére hivatkozni. A copyIndex() függvény az aktuális indexet adja vissza. A harmadik ismétlődő bejegyzés esetében például a copyIndex() a 2 értéket adja vissza. A copyIndex() szintaxisa az alábbihoz hasonló:

copyIndex(loopName, offset)

A copyIndex() függvény két bemeneti paramétere a loopName és az offset. Az offset paraméter mindig opcionális, és az aktuális index eltolására használható. Az offset megadott értéke hozzá lesz adva az aktuális indexhez. Ha az aktuális index értéke 2, Ön pedig az 1 értéket adja meg, akkor a copyIndex() függvény a 3 értéket adja vissza.

A loopName paraméter a használati helyétől függően lehet opcionális vagy kötelező is. properties szerkezetben használva kötelező, a resources tömbjében használva opcionális. Az alábbi példában kötelező:

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

A copy elem egy properties szerkezetben található, a copyIndex()copyIndex('dataDisks') tulajdonsága pedig loopName.

Az alábbi példában a loopName nem kötelező:

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

Itt egy erőforrás van deklarálva, a copyIndex() pedig paraméterek nélkül van meghívva, mivel egy erőforrás kontextusában használják.

A telepítés konfigurálása

Ha a copy elemet erőforrásokhoz használja, végeredményben sok hasonló erőforrást fog létrehozni.

Előfordulhat, hogy szabályozni szeretné az erőforrások létrehozásának módját és sorrendjét. A sorrend szabályozását indokolhatja az alábbiak egyike:

  • Környezeti korlátozások. Az üzembe helyezés környezetétől függően esetleg korlátozni szeretné, hogy milyen mértékben befolyásolja az üzembe helyezés ezt a környezetet. Éles környezet érdemes korlátozni az egy adott pillanatban érintett erőforrások számát. Az egyidejűleg üzembe helyezett erőforrások számának szabályozására konfigurálhatja az üzembe helyezési módot.
  • Függőségek. Előfordulhat, hogy egy szükséges erőforrás létrehozása attól függ, hogy valami más már létezzen. Az ilyen függőségek kifejtésére szolgál a dependsOn szerkezet.

Üzembe helyezési módok és copy

Lehetséges, hogy biztosítani szeretné, hogy a copy szerkezet által létrehozott összes erőforrás valami más előtt legyen létrehozva. Ilyen esetben ezt ki is kell fejeznie. Itt a Resource Manager által használt üzembe helyezési módok jutnak szerephez. Két támogatott mód van:

  • Soros. Ha egy erőforrás ilyen üzembe helyezési módra van beállítva, akkor egyik a másik után lesz létrehozva. Ebben a módban a rendszer egy batchSize (kötegméret) tulajdonság beállítását is várja, amely meghatározza, hogy hány erőforrás legyen üzembe helyezve ezen a módon. Egy új köteg nem indítható el, mielőtt egy előző befejeződött volna. Ezt a korlátozási módot ajánlott használni éles környezetben, ahol például fontos lehet korlátozni az egyidejűleg érintett erőforrások számát.
  • Párhuzamos. Ez az alapértelmezett üzembe helyezési mód. Előnye a nagy sebesség, tehát a sablon feldolgozása gyorsabban megtörténik. Hátránya, hogy nem garantálható a sorrend, ez pedig éles környezetben nem ajánlott.

Függőségek

A copy elem kontextusában a függőséggel rendelkező erőforráshoz meg kell adni, hogy az elem melyik szakaszára kell várakoznia. Ezt a függőséget úgy adhatja meg, hogy a nevével hivatkozik rá, ahogyan az alábbi JSON-kódban:

"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"],
    }
  ]

A copy elemnek van egy storagecopy értékű name tulajdonsága. A függő erőforrás (a tárfiók) megvárja, hogy befejeződjön a copy elem művelete. Ezt a "dependsOn": ["storagecopy"] fejezi ki.

Az ARM-sablon ezért soros üzembe helyezési módra vált a két erőforrás között. Ez érintheti az üzembe helyezés sebességét, de Ön kifejezte, hogy fontos az adott üzembe helyezési sorrend, és ez élvez elsőbbséget.