Iteratie van eigenschappen in ARM-sjablonen
In dit artikel leest u hoe u meer dan één exemplaar van een eigenschap maakt in uw Arm-sjabloon (Azure Resource Manager). Door een kopieerlus toe te voegen aan de eigenschappensectie van een resource in uw sjabloon, kunt u het aantal items voor een eigenschap dynamisch instellen tijdens de implementatie. U voorkomt ook dat u de syntaxis van de sjabloon moet herhalen.
U kunt alleen een kopieerlus gebruiken met resources op het hoogste niveau, zelfs wanneer u een kopieerlus toepast op een eigenschap. Zie Iteratie voor een onderliggende resource voor meer informatie over het wijzigen van een onderliggende resource in een resource op het hoogste niveau.
U kunt ook een kopieerlus gebruiken met resources, variabelen en uitvoer.
Tip
We raden Bicep aan omdat het dezelfde mogelijkheden biedt als ARM-sjablonen en de syntaxis gemakkelijker te gebruiken is. Zie lussen voor meer informatie.
Syntaxis
Voeg het copy
element toe aan de sectie Resources van uw sjabloon om het aantal items voor een eigenschap in te stellen. Het kopieerelement heeft de volgende algemene indeling:
"copy": [
{
"name": "<name-of-property>",
"count": <number-of-iterations>,
"input": <values-for-the-property>
}
]
Geef name
de naam op van de resource-eigenschap die u wilt maken.
De count
eigenschap geeft het aantal iteraties op dat u wilt gebruiken voor de eigenschap.
De input
eigenschap geeft de eigenschappen op die u wilt herhalen. U maakt een matrix met elementen die zijn samengesteld op basis van de waarde in de input
eigenschap.
Kopieerlimieten
Het aantal mag niet groter zijn dan 800.
Het aantal kan geen negatief getal zijn. Dit kan nul zijn als u de sjabloon implementeert met een recente versie van Azure CLI, PowerShell of REST API. U moet met name het volgende gebruiken:
- Azure PowerShell 2.6 of hoger
- Azure CLI 2.0.74 of hoger
- REST API-versie 2019-05-10 of hoger
- Gekoppelde implementaties moeten API-versie 2019-05-10 of hoger gebruiken voor het implementatieresourcetype
Eerdere versies van PowerShell, CLI en de REST API bieden geen ondersteuning voor nul voor het aantal.
Iteratie van eigenschappen
In het volgende voorbeeld ziet u hoe u een kopieerlus toepast op de dataDisks
eigenschap op een virtuele machine:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"numberOfDataDisks": {
"type": "int",
"minValue": 0,
"maxValue": 16,
"defaultValue": 3,
"metadata": {
"description": "The number of dataDisks to create."
}
},
...
},
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2022-11-01",
...
"properties": {
"storageProfile": {
...
"copy": [
{
"name": "dataDisks",
"count": "[parameters('numberOfDataDisks')]",
"input": {
"lun": "[copyIndex('dataDisks')]",
"createOption": "Empty",
"diskSizeGB": 1023
}
}
]
}
...
}
}
]
}
Wanneer u copyIndex binnen een eigenschapsiteratie gebruikt, moet u de naam van de iteratie opgeven. Iteratie van eigenschappen ondersteunt ook een offsetargument. De offset moet achter de naam van de iteratie komen, zoals copyIndex('dataDisks', 1)
.
De geïmplementeerde sjabloon wordt:
{
"name": "examplevm",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-06-01",
"properties": {
"storageProfile": {
"dataDisks": [
{
"lun": 0,
"createOption": "Empty",
"diskSizeGB": 1023
},
{
"lun": 1,
"createOption": "Empty",
"diskSizeGB": 1023
},
{
"lun": 2,
"createOption": "Empty",
"diskSizeGB": 1023
}
],
...
De kopieerbewerking is handig wanneer u met matrices werkt, omdat u elk element in de matrix kunt herhalen. Gebruik de lengtefunctie in de matrix om het aantal iteraties op te geven en copyIndex
om de huidige index in de matrix op te halen.
Met de volgende voorbeeldsjabloon wordt een failovergroep gemaakt voor databases die als matrix worden doorgegeven.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"primaryServerName": {
"type": "string"
},
"secondaryServerName": {
"type": "string"
},
"databaseNames": {
"type": "array",
"defaultValue": [
"mydb1",
"mydb2",
"mydb3"
]
}
},
"variables": {
"failoverName": "[format('{0}/{1}failovergroups', parameters('primaryServerName'), parameters('primaryServerName'))]"
},
"resources": [
{
"type": "Microsoft.Sql/servers/failoverGroups",
"apiVersion": "2015-05-01-preview",
"name": "[variables('failoverName')]",
"properties": {
"readWriteEndpoint": {
"failoverPolicy": "Automatic",
"failoverWithDataLossGracePeriodMinutes": 60
},
"readOnlyEndpoint": {
"failoverPolicy": "Disabled"
},
"partnerServers": [
{
"id": "[resourceId('Microsoft.Sql/servers', parameters('secondaryServerName'))]"
}
],
"copy": [
{
"name": "databases",
"count": "[length(parameters('databaseNames'))]",
"input": "[resourceId('Microsoft.Sql/servers/databases', parameters('primaryServerName'), parameters('databaseNames')[copyIndex('databases')])]"
}
]
}
}
],
"outputs": {
}
}
Het copy
element is een matrix, zodat u meer dan één eigenschap voor de resource kunt opgeven.
{
"type": "Microsoft.Network/loadBalancers",
"apiVersion": "2017-10-01",
"name": "exampleLB",
"properties": {
"copy": [
{
"name": "loadBalancingRules",
"count": "[length(parameters('loadBalancingRules'))]",
"input": {
...
}
},
{
"name": "probes",
"count": "[length(parameters('loadBalancingRules'))]",
"input": {
...
}
}
]
}
}
U kunt iteraties van resources en eigenschappen samen gebruiken. Verwijs naar de iteratie van de eigenschap op naam.
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2018-04-01",
"name": "[format('{0}{1}', parameters('vnetname'), copyIndex())]",
"copy":{
"count": 2,
"name": "vnetloop"
},
"location": "[resourceGroup().location]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"[parameters('addressPrefix')]"
]
},
"copy": [
{
"name": "subnets",
"count": 2,
"input": {
"name": "[format('subnet-{0}', copyIndex('subnets'))]",
"properties": {
"addressPrefix": "[variables('subnetAddressPrefix')[copyIndex('subnets')]]"
}
}
}
]
}
}
Voorbeeldsjablonen
In het volgende voorbeeld ziet u een veelvoorkomend scenario voor het maken van meer dan één waarde voor een eigenschap.
Sjabloon | Beschrijving |
---|---|
VM-implementatie met een variabel aantal gegevensschijven | Hiermee worden verschillende gegevensschijven met een virtuele machine geïmplementeerd. |
Volgende stappen
- Zie Zelfstudie: Meerdere resource-exemplaren maken met ARM-sjablonen om een zelfstudie te doorlopen.
- Zie voor andere toepassingen van de kopieerlus:
- Zie De structuur en syntaxis van ARM-sjablonen begrijpen als u meer wilt weten over de secties van een sjabloon.
- Zie Resources implementeren met ARM-sjablonen en Azure PowerShell voor meer informatie over het implementeren van uw sjabloon.