Iterazione delle variabili nei modelli di ARM
Questo articolo illustra come creare più di un valore per una variabile nel modello di Azure Resource Manager (modello arm). Aggiungendo l'elemento copy
alla sezione variables del modello, è possibile impostare dinamicamente il numero di elementi per una variabile durante la distribuzione. Eviti anche di dover ripetere la sintassi del modello.
È anche possibile usare la copia con risorse, proprietà in una risorsa e output.
Suggerimento
È consigliabile Bicep perché offre le stesse funzionalità dei modelli di ARM e la sintassi è più semplice da usare. Per saperne di più, vedi cicli.
Sintassi
L'elemento copia ha il seguente formato generale:
"copy": [
{
"name": "<name-of-loop>",
"count": <number-of-iterations>,
"input": <values-for-the-variable>
}
]
La proprietà name
è qualsiasi valore che identifica il ciclo. La count
proprietà specifica il numero di iterazioni desiderate per la variabile.
La proprietà input
specifica le proprietà che vuoi ripetere. Si crea una matrice di elementi costruita dal valore della proprietà input
. Può essere una singola proprietà (ad esempio una stringa) o un oggetto con diverse proprietà.
Limiti di copia
Il totale non può superare 800.
Il totale non può essere un numero negativo. Può essere zero se distribuisci il modello con una versione recente dell'interfaccia della riga di comando di Azure, PowerShell o API REST. In particolare, devi usare:
- Azure PowerShell 2.6 o versione successiva
- Interfaccia della riga di comando di Azure 2.0.74 o versione successiva
- API REST versione 2019-05-10 o successiva
- Le distribuzioni collegate devono usare la versione API 2019-05-10 o successiva per il tipo di risorsa di distribuzione
Le versioni precedenti di PowerShell, dell'interfaccia della riga di comando e dell'API REST non supportano zero per il conteggio.
Iterazione delle variabili
Nell'esempio seguente viene illustrato come creare una matrice di valori stringa:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"itemCount": {
"type": "int",
"defaultValue": 5
}
},
"variables": {
"copy": [
{
"name": "stringArray",
"count": "[parameters('itemCount')]",
"input": "[concat('item', copyIndex('stringArray', 1))]"
}
]
},
"resources": [],
"outputs": {
"arrayResult": {
"type": "array",
"value": "[variables('stringArray')]"
}
}
}
Il modello precedente restituisce una matrice con i valori seguenti:
[
"item1",
"item2",
"item3",
"item4",
"item5"
]
Nell'esempio seguente viene illustrato come creare una matrice di oggetti con tre proprietà: name
, diskSizeGB
e diskIndex
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"itemCount": {
"type": "int",
"defaultValue": 5
}
},
"variables": {
"copy": [
{
"name": "objectArray",
"count": "[parameters('itemCount')]",
"input": {
"name": "[concat('myDataDisk', copyIndex('objectArray', 1))]",
"diskSizeGB": "1",
"diskIndex": "[copyIndex('objectArray')]"
}
}
]
},
"resources": [],
"outputs": {
"arrayResult": {
"type": "array",
"value": "[variables('objectArray')]"
}
}
}
L'esempio precedente restituisce una matrice con i valori seguenti:
[
{
"name": "myDataDisk1",
"diskSizeGB": "1",
"diskIndex": 0
},
{
"name": "myDataDisk2",
"diskSizeGB": "1",
"diskIndex": 1
},
{
"name": "myDataDisk3",
"diskSizeGB": "1",
"diskIndex": 2
},
{
"name": "myDataDisk4",
"diskSizeGB": "1",
"diskIndex": 3
},
{
"name": "myDataDisk5",
"diskSizeGB": "1",
"diskIndex": 4
}
]
Nota
L'iterazione variabile supporta un argomento offset. L'offset deve venire dopo il nome dell'iterazione, ad esempio copyIndex('diskNames', 1)
. Se non si specifica un valore di offset, il valore predefinito è 0 per la prima istanza.
È anche possibile usare l'elemento copy
all'interno di una variabile. Nell'esempio seguente viene creato un oggetto con una matrice come uno dei relativi valori.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"itemCount": {
"type": "int",
"defaultValue": 5
}
},
"variables": {
"topLevelObject": {
"sampleProperty": "sampleValue",
"copy": [
{
"name": "disks",
"count": "[parameters('itemCount')]",
"input": {
"name": "[concat('myDataDisk', copyIndex('disks', 1))]",
"diskSizeGB": "1",
"diskIndex": "[copyIndex('disks')]"
}
}
]
}
},
"resources": [],
"outputs": {
"objectResult": {
"type": "object",
"value": "[variables('topLevelObject')]"
}
}
}
L'esempio precedente restituisce un oggetto con i valori seguenti:
{
"sampleProperty": "sampleValue",
"disks": [
{
"name": "myDataDisk1",
"diskSizeGB": "1",
"diskIndex": 0
},
{
"name": "myDataDisk2",
"diskSizeGB": "1",
"diskIndex": 1
},
{
"name": "myDataDisk3",
"diskSizeGB": "1",
"diskIndex": 2
},
{
"name": "myDataDisk4",
"diskSizeGB": "1",
"diskIndex": 3
},
{
"name": "myDataDisk5",
"diskSizeGB": "1",
"diskIndex": 4
}
]
}
L'esempio seguente illustra i diversi modi in cui è possibile usare copy
con le variabili.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {
"disk-array-on-object": {
"copy": [
{
"name": "disks",
"count": 5,
"input": {
"name": "[concat('myDataDisk', copyIndex('disks', 1))]",
"diskSizeGB": "1",
"diskIndex": "[copyIndex('disks')]"
}
},
{
"name": "diskNames",
"count": 5,
"input": "[concat('myDataDisk', copyIndex('diskNames', 1))]"
}
]
},
"copy": [
{
"name": "top-level-object-array",
"count": 5,
"input": {
"name": "[concat('myDataDisk', copyIndex('top-level-object-array', 1))]",
"diskSizeGB": "1",
"diskIndex": "[copyIndex('top-level-object-array')]"
}
},
{
"name": "top-level-string-array",
"count": 5,
"input": "[concat('myDataDisk', copyIndex('top-level-string-array', 1))]"
},
{
"name": "top-level-integer-array",
"count": 5,
"input": "[copyIndex('top-level-integer-array')]"
}
]
},
"resources": [],
"outputs": {
"exampleObject": {
"value": "[variables('disk-array-on-object')]",
"type": "object"
},
"exampleArrayOnObject": {
"value": "[variables('disk-array-on-object').disks]",
"type" : "array"
},
"exampleObjectArray": {
"value": "[variables('top-level-object-array')]",
"type" : "array"
},
"exampleStringArray": {
"value": "[variables('top-level-string-array')]",
"type" : "array"
},
"exampleIntegerArray": {
"value": "[variables('top-level-integer-array')]",
"type" : "array"
}
}
}
Modelli di esempio
Gli esempi seguenti illustrano scenari comuni per la creazione di più valori per una variabile.
Modello | Descrizione |
---|---|
Copia variabili | Mostra le diverse modalità di iterazione delle variabili. |
Più regole di sicurezza | Distribuisce più regole di sicurezza a un gruppo di sicurezza di rete. Costruisce le regole di sicurezza da un parametro. Per il parametro, vedere il file di parametri NSG multipli. |
Copiare l'archiviazione con le variabili | Esempio di come eseguire l'iterazione di una variabile e creare più account di archiviazione. |
Passaggi successivi
- Per eseguire un'esercitazione, vedi Esercitazione: Creare più istanze di risorse usando i modelli di ARM.
- Per altri usi dell'elemento copy, vedere:
- Per informazioni sulle sezioni di un modello, vedi Comprendere la struttura e la sintassi dei modelli di ARM.
- Per informazioni su come distribuire il tuo modello, vedi Distribuire le risorse con i modelli di ARM e Azure PowerShell.