Több erőforráspéldány létrehozása a copy elem használatával
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.