Egenskaps iteration i ARM-mallar
Den här artikeln visar hur du skapar mer än en instans av en egenskap i din Azure Resource Manager-mall (ARM-mall). Genom att lägga till en kopieringsloop i egenskapsavsnittet för en resurs i mallen kan du dynamiskt ange antalet objekt för en egenskap under distributionen. Du kan också undvika att behöva upprepa mallsyntaxen.
Du kan bara använda en kopieringsloop med resurser på den översta nivån, även när du tillämpar en kopieringsloop på en egenskap. Mer information om hur du ändrar en underordnad resurs till en resurs på den översta nivån finns i Iteration för en underordnad resurs.
Du kan också använda en kopieringsloop med resurser, variabler och utdata.
Dricks
Vi rekommenderar Bicep eftersom det erbjuder samma funktioner som ARM-mallar och syntaxen är enklare att använda. Mer information finns i loopar.
Syntax
Lägg till elementet copy
i resursavsnittet i mallen för att ange antalet objekt för en egenskap. Kopieringselementet har följande allmänna format:
"copy": [
{
"name": "<name-of-property>",
"count": <number-of-iterations>,
"input": <values-for-the-property>
}
]
För name
anger du namnet på den resursegenskap som du vill skapa.
Egenskapen count
anger antalet iterationer som du vill ha för egenskapen.
Egenskapen input
anger de egenskaper som du vill upprepa. Du skapar en matris med element som skapats från värdet i egenskapen input
.
Kopieringsgränser
Antalet får inte överstiga 800.
Antalet får inte vara ett negativt tal. Det kan vara noll om du distribuerar mallen med en ny version av Azure CLI, PowerShell eller REST API. Mer specifikt måste du använda:
- Azure PowerShell 2.6 eller senare
- Azure CLI 2.0.74 eller senare
- REST API version 2019-05-10 eller senare
- Länkade distributioner måste använda API-version 2019-05-10 eller senare för distributionsresurstypen
Tidigare versioner av PowerShell, CLI och REST API stöder inte noll för antal.
Iteration av egenskap
I följande exempel visas hur du tillämpar en kopieringsloop på dataDisks
egenskapen på en virtuell dator:
{
"$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
}
}
]
}
...
}
}
]
}
Observera att när du använder copyIndex i en egenskaps-iteration måste du ange namnet på iterationen. Egenskaps iteration stöder också ett offsetargument. Förskjutningen måste komma efter namnet på iterationen, till exempel copyIndex('dataDisks', 1)
.
Den distribuerade mallen blir:
{
"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
}
],
...
Kopieringsåtgärden är användbar när du arbetar med matriser eftersom du kan iterera genom varje element i matrisen. Använd längdfunktionen i matrisen för att ange antalet iterationer och copyIndex
för att hämta det aktuella indexet i matrisen.
I följande exempelmall skapas en redundansgrupp för databaser som skickas som en matris.
{
"$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": {
}
}
Elementet copy
är en matris så att du kan ange mer än en egenskap för resursen.
{
"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": {
...
}
}
]
}
}
Du kan använda resurs- och egenskaps-iterationer tillsammans. Referera till egenskaps-iterationen efter namn.
{
"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')]]"
}
}
}
]
}
}
Exempelmallar
I följande exempel visas ett vanligt scenario för att skapa mer än ett värde för en egenskap.
Mall | beskrivning |
---|---|
Distribution av virtuella datorer med ett variabelt antal datadiskar | Distribuerar flera datadiskar med en virtuell dator. |
Nästa steg
- Om du vill gå igenom en självstudie kan du läsa Självstudie: Skapa flera resursinstanser med ARM-mallar.
- För andra användningar av kopieringsloopen, se:
- Om du vill lära dig mer om avsnitten i en mall kan du läsa Förstå strukturen och syntaxen för ARM-mallar.
- Information om hur du distribuerar mallen finns i Distribuera resurser med ARM-mallar och Azure PowerShell.