Iterazione delle proprietà nei modelli di Resource Manager
Questo articolo illustra come creare più istanze di una proprietà nel modello di Azure Resource Manager (modello arm). Aggiungendo il ciclo di copia alla sezione delle proprietà di una risorsa nel modello, è possibile impostare in modo dinamico il numero di elementi per una proprietà durante la distribuzione. Evitare inoltre di dover ripetere la sintassi del modello.
È possibile usare il ciclo di copia solo con risorse di primo livello, anche quando si applica il ciclo di copia a una proprietà. Per informazioni sulla modifica di una risorsa figlio in una risorsa di primo livello, vedere Iterazione per una risorsa figlio.
È anche possibile usare il ciclo di copia con risorse, variabili e output.
Suggerimento
È consigliabile usare Bicep perché offre le stesse funzionalità dei modelli arm e la sintassi è più semplice da usare. Per altre informazioni, vedere Cicli.
Sintassi
Aggiungere l'elemento copy
alla sezione resources del modello per impostare il numero di elementi per una proprietà. L'elemento copy ha il formato generale seguente:
"copy": [
{
"name": "<name-of-property>",
"count": <number-of-iterations>,
"input": <values-for-the-property>
}
]
Per name
specificare il nome della proprietà della risorsa che si vuole creare.
La count
proprietà specifica il numero di iterazioni desiderate per la proprietà .
La input
proprietà specifica le proprietà che si desidera ripetere. Si crea una matrice di elementi costruita dal valore della proprietà input
.
Limiti di copia
Il conteggio non può superare 800.
Il conteggio non può essere un numero negativo. Può essere zero se si distribuisce il modello con una versione recente dell'interfaccia della riga di comando di Azure, di PowerShell o dell'API REST. In particolare, è necessario usare:
- Azure PowerShell 2.6 o versioni successive
- Interfaccia della riga di comando di Azure 2.0.74 o 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, l'interfaccia della riga di comando e l'API REST non supportano zero per il conteggio.
Iterazione delle proprietà
Nell'esempio seguente viene illustrato come applicare il dataDisks
ciclo di copia alla proprietà in una macchina virtuale:
{
"$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
}
}
]
}
...
}
}
]
}
Si noti che quando si usa copyIndex all'interno di un'iterazione di proprietà, è necessario specificare il nome dell'iterazione. L'iterazione delle proprietà supporta anche un argomento offset. L'offset deve venire dopo il nome dell'iterazione, ad esempio copyIndex('dataDisks', 1)
.
Il modello distribuito diventa:
{
"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
}
],
...
L'operazione di copia è utile quando si lavora con le matrici in quanto è possibile iterare ogni elemento della matrice. Usare la funzione length nella matrice per specificare il conteggio per le iterazioni e copyIndex
recuperare l'indice corrente nella matrice.
Il modello di esempio seguente crea un gruppo di failover per i database passati come matrice.
{
"$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": {
}
}
L'elemento copy
è una matrice in modo da poter specificare più di una proprietà per la risorsa.
{
"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": {
...
}
}
]
}
}
È possibile usare insieme le iterazioni delle risorse e delle proprietà. Fare riferimento all'iterazione di proprietà con il nome.
{
"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')]]"
}
}
}
]
}
}
Modelli di esempio
Nell'esempio seguente viene illustrato uno scenario comune per la creazione di più valori per una proprietà.
Modello | Descrizione |
---|---|
Distribuzione VM con un numero variabile di dischi dati | Distribuisce più dischi dati con una macchina virtuale. |
Passaggi successivi
- Per un'esercitazione, vedere Esercitazione: Creare più istanze di risorse con i modelli di Resource Manager.
- Per altri usi del ciclo di copia, vedere:
- Per informazioni sulle sezioni di un modello, vedere Comprendere la struttura e la sintassi dei modelli di Resource Manager.
- Per informazioni su come distribuire il modello, vedere Distribuire le risorse con i modelli di Resource Manager e Azure PowerShell.