Meerdere bronexemplaren maken met behulp van het copy-element

Voltooid

U hebt tot dusver resources gedeclareerd in een resourcelijst in een sjabloon. Tijdens de implementatie wordt er één exemplaar opgehaald van elk item dat is opgegeven in de lijst met resources. Mogelijk wilt u meer dan één exemplaar van een specifieke resource maken. U wilt bijvoorbeeld meerdere subnetten in een virtueel netwerk hebben.

Houd rekening met de volgende vragen en punten wanneer u een groot aantal exemplaren wilt maken en doorlopende constructies wilt uitvoeren:

  • Heb ik meer dan één exemplaar nodig: Voor eenvoudigere scenario's is het mogelijk dat u dat niet doet. Bij uitgebreidere scenario's, zoals subnetten of virtuele machines, moet u wellicht overwegen of u meer dan één exemplaar van iets nodig hebt.
  • Ben ik afhankelijk van een resource: Normaal gesproken is Azure Resource Manager goed in het uitzoeken wat er in welke volgorde moet worden samengesteld, zodat verwijzingen in de Azure Resource Manager-sjabloon worden uitgewerkt. Er zijn echter situaties waarin u mogelijk de bestelling moet opgeven.
  • Definieer een naamgevingsschema: u wilt uw resources betekenisvolle namen geven. Hiervoor gebruikt u parameters die worden doorgegeven tijdens de implementatie. Wanneer u meerdere exemplaren hebt, wilt u mogelijk meer controlemogelijkheden en wilt u namen kunnen baseren op de herhaling in de actieve kopieervolgorde.
  • Het maken van resources configureren en beheren: mogelijk wilt u beperken hoeveel resources er worden gemaakt in een productieomgeving. U kunt hiertoe de aanmaak van resources serieel of parallel configureren.
  • Andere typen kopiëren: Resources zijn niet het enige wat u kunt maken van meerdere kopieën en deze herhalen. U kunt hetzelfde doen met eigenschappen, variabelen en uitvoer.
  • Bovenliggend/onderliggend item: mogelijk moet u relaties tussen bovenliggende en onderliggende items in uw resources configureren.

Meerdere exemplaren maken

U kunt herhalingsconstructies gebruiken om toetsaanslagen te besparen. Als datgene wat u herhaaldelijk nodig hebt, vergelijkbaar is qua naam en type en slechts geringe verschillen kent, kunt u wellicht baat hebben bij het gebruik van het copy-element.

Het copy-element is een stukje JSON dat u voor allerlei soorten constructies kunt gebruiken, zoals resources, eigenschappen, variabelen en uitvoer. De syntaxis van het copy-element bestaat uit de sleutel copy en een matrix als de waarde. Voorbeeld: "copy": [].

De matrix gebruikt een aantal elementen en elk element is een object {} dat bestaat uit een set eigenschappen. Wat deze eigenschappen zijn, is afhankelijk van het type constructie waarvoor ze worden gebruikt. Normaal gesproken bevat alle constructies van het copy-element één gemeenschappelijke eigenschap: count. Deze eigenschap bepaalt het aantal exemplaren van een bepaald type constructie dat u wilt maken. De meeste constructies bieden ook een name-eigenschap om een referentie op te geven waarnaar u in andere onderdelen van uw code kunt verwijzen. Andere eigenschappen die worden gebruikt, kunnen per constructie verschillen.

Wat u moet kiezen

U kunt het volgende vragen: 'Als ik het copy element voor veel soorten constructies kan gebruiken, welke moet ik kiezen en wanneer, en kan ik meer dan één type in een sjabloon gebruiken?'

Het hangt allemaal af van uw case. Met een resource-iteratie kunt u een groot aantal kopieën van een resource maken. Dit is handig als u bijvoorbeeld veel opslagaccounts nodig hebt. Met een iteratie van eigenschappen kunt u veel eigenschappen binnen één resource maken. Het doel is om toetsaanslagen en tijd te besparen, maar u weet zelf het beste waar u onderdelen in uw sjabloon hebt herhaald.

U kunt het element copy op veel plaatsen in uw sjabloon gebruiken. U kunt een copy-element gebruiken om veel resources te maken, maar ook om veel soortgelijke variabelen in dezelfde sjabloon te maken.

Hoe het werkt

Het copy-element werkt doordat uw copy-instructie wordt geëvalueerd en vervangen. De vervanging is het resultaat van wat u definieert in de copy instructie die zo vaak wordt herhaald als u in het copy veld hebt aangegeven.

In het volgende voorbeeld ziet u hoe een definitie met copy eruit kan zien:

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

Let op de invoer count: 2. De waarde 2 betekent dat u de bovenstaande expressie wilt uitbreiden tot twee vermeldingen. U krijgt het volgende resultaat:

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

U ziet dat de waarde van de eigenschap name de naam van de eigenschap is geworden en dat de inhoud van de eigenschap input het herhaalde deel van de JSON is geworden.

Notitie

De copy-expressie en de uitvoer verschillen, afhankelijk van het type expressie dat wordt gebruikt. Het vorige voorbeeld geeft een goed idee van wat er gebeurt wanneer een expressie wordt omgezet in een reeks herhaalde instructies.

Er is een grens aan hoeveel er kan worden gekopieerd. De limiet is momenteel 800 vermeldingen.

Belangrijk

Zie Resource-iteratie in ARM-sjablonen voor meer informatie over de exacte beperkingen.

De iteratie beheren

Er zijn hulpfuncties waarmee u naar specifieke indexen in de matrix kunt verwijzen. De functie copyIndex() retourneert de huidige index. Voor de derde herhaalde vermelding retourneert copyIndex() bijvoorbeeld de waarde 2. De syntaxis van copyIndex() ziet er als volgt uit:

copyIndex(loopName, offset)

De functie copyIndex() heeft twee verschillende invoerparameters: loopName en offset. De parameter offset is altijd optioneel en kan worden gebruikt als verschuiving ten opzichte van de huidige index. Wat u toevoegt als de waarde voor offset, wordt toegevoegd aan de huidige index. Als de huidige index 2 retourneert en u 1 als verschuiving opgeeft, retourneert de functie copyIndex() de waarde 3.

De parameter loopName is optioneel of verplicht, afhankelijk van waar deze wordt gebruikt. Dit is verplicht als deze wordt gebruikt in een properties-constructie en optioneel als deze wordt gebruikt in een resources-matrix. Hier ziet u een voorbeeld waarin de parameter verplicht is:

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

U ziet dat het element copy wordt gebruikt binnen een properties-constructie en dat copyIndex() de loopName als copyIndex('dataDisks') heeft opgegeven.

Hier volgt een voorbeeld waarin loopName niet verplicht is:

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

Dit toont een resource die wordt gedeclareerd, waarbij copyIndex() wordt aangeroepen zonder parameters, omdat deze wordt gebruikt in de context van een resource.

De implementatie configureren

Wanneer u het copy-element voor resources gebruikt, kunt u een groot aantal vergelijkbare resources maken.

Soms wilt u misschien bepalen hoe en in welke volgorde resources worden gemaakt. Redenen voor het bepalen van de volgorde zijn onder meer:

  • Omgevingsbeperkingen. Afhankelijk van de omgeving waarin u implementeert, wilt u mogelijk beperken hoeveel deze omgeving wordt beïnvloed door een implementatie. In een productieomgeving is het zinvol om het aantal resources te beperken dat tegelijkertijd wordt beïnvloed. U kunt een implementatiemodus configureren om het aantal resources te bepalen dat gelijktijdig kan worden geïmplementeerd.
  • Afhankelijkheden. Soms bent u ervan afhankelijk of iets al bestaat voordat u de benodigde resources kunt maken. Als u een dergelijke afhankelijkheid wilt uitdrukken, gebruikt u een dependsOn-constructie.

Implementatiemodi en copy

U wilt mogelijk dat een set resources is gemaakt door de copy-constructie voordat u iets anders maakt. Als dat het geval is, moet u deze situatie uitdrukken. Onthoud dat u hier te maken hebt met de implementatiemodus die door Resource Manager wordt gebruikt. Er worden twee modi ondersteund:

  • Serieel. Als u resources implementeert in deze modus, worden ze een voor een gemaakt. In deze modus wordt ook verwacht dat u de eigenschap batchSize instelt om te bepalen hoeveel resources er worden geïmplementeerd in deze modus. Een nieuwe batch kan niet worden gestart voordat een vorige batch is voltooid. Mogelijk wilt u op deze manier dingen beperken in een productieomgeving, bijvoorbeeld wanneer het belangrijk is om het aantal betrokken resources op enig moment te beperken.
  • Parallel. Dit is de standaard implementatiemodus. Het voordeel is een hoge doorvoer, zodat de sjabloon sneller wordt verwerkt. Nadelen van deze modus zijn dat u geen volgorde kunt opgeven en dat deze modus mogelijk niet is wat u wilt in uw productieomgeving.

Afhankelijkheden

In de context van het copy-element moet u de resource, middels de afhankelijkheid, vertellen op welk sectie moet worden gewacht. U kunt deze afhankelijkheid opgeven door naar de naam te verwijzen met behulp van de volgende 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"],
    }
  ]

U ziet dat het element copy de eigenschap name heeft, met de waarde storagecopy. De afhankelijke resource, een opslagaccount, wacht tot de bewerking van het element copy is voltooid. Dit wordt uitgedrukt door "dependsOn": ["storagecopy"].

Hierdoor schakelt de ARM-sjabloon over naar de seriële implementatiemodus tussen deze twee resources. Dit kan van invloed zijn op de doorvoersnelheid van de implementatie, maar u hebt aangegeven dat u een bepaalde implementatievolgorde belangrijker vindt, dus dat krijgt nu voorrang.