Iteração variável em modelos do ARM
Este artigo mostra-lhe como criar mais do que um valor para uma variável no modelo de Resource Manager do Azure (modelo do ARM). Ao adicionar o copy
elemento à secção de variáveis do modelo, pode definir dinamicamente o número de itens para uma variável durante a implementação. Também evita ter de repetir a sintaxe do modelo.
Também pode utilizar a cópia com recursos, propriedades num recurso e saídas.
Dica
Recomendamos o Bicep porque oferece as mesmas capacidades que os modelos do ARM e a sintaxe é mais fácil de utilizar. Para saber mais, veja ciclos.
Syntax
O elemento copy tem o seguinte formato geral:
"copy": [
{
"name": "<name-of-loop>",
"count": <number-of-iterations>,
"input": <values-for-the-variable>
}
]
A name
propriedade é qualquer valor que identifique o ciclo. A count
propriedade especifica o número de iterações que pretende para a variável.
A input
propriedade especifica as propriedades que pretende repetir. Pode criar uma matriz de elementos construídos a partir do valor na input
propriedade. Pode ser uma única propriedade (como uma cadeia) ou um objeto com várias propriedades.
Copiar limites
A contagem não pode exceder os 800.
A contagem não pode ser um número negativo. Pode ser zero se implementar o modelo com uma versão recente da CLI do Azure, do PowerShell ou da API REST. Especificamente, tem de utilizar:
- Azure PowerShell 2.6 ou posterior
- CLI do Azure 2.0.74 ou posterior
- Versão da API REST 2019-05-10 ou posterior
- As implementações ligadas têm de utilizar a versão da API 2019-05-10 ou posterior para o tipo de recurso de implementação
As versões anteriores do PowerShell, da CLI e da API REST não suportam zero para contagem.
Iteração variável
O exemplo seguinte mostra como criar uma matriz de valores de cadeia:
{
"$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')]"
}
}
}
O modelo anterior devolve uma matriz com os seguintes valores:
[
"item1",
"item2",
"item3",
"item4",
"item5"
]
O exemplo seguinte mostra como criar uma matriz de objetos com três propriedades - 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')]"
}
}
}
O exemplo anterior devolve uma matriz com os seguintes valores:
[
{
"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
A iteração variável suporta um argumento de deslocamento. O desvio tem de ser apresentado a seguir ao nome da iteração, como copyIndex('diskNames', 1)
. Se não fornecer um valor de deslocamento, a predefinição é 0 para a primeira instância.
Também pode utilizar o copy
elemento numa variável. O exemplo seguinte cria um objeto que tem uma matriz como um dos respetivos valores.
{
"$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')]"
}
}
}
O exemplo anterior devolve um objeto com os seguintes valores:
{
"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
}
]
}
O exemplo seguinte mostra as diferentes formas que pode utilizar copy
com variáveis.
{
"$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"
}
}
}
Modelos de exemplo
Os exemplos seguintes mostram cenários comuns para criar mais do que um valor para uma variável.
Modelo | Descrição |
---|---|
Copiar variáveis | Demonstra as diferentes formas de iterar em variáveis. |
Várias regras de segurança | Implementa várias regras de segurança num grupo de segurança de rede. Constrói as regras de segurança a partir de um parâmetro. Para o parâmetro, veja vários ficheiros de parâmetroS NSG. |
Copiar armazenamento com variáveis | Exemplo de como iterar uma variável e criar várias contas de armazenamento. |
Passos seguintes
- Para ver um tutorial, veja Tutorial: Criar várias instâncias de recursos com modelos do ARM.
- Para outras utilizações do elemento copy, consulte:
- Se quiser saber mais sobre as secções de um modelo, veja Compreender a estrutura e a sintaxe dos modelos do ARM.
- Para saber como implementar o modelo, veja Implementar recursos com modelos arm e Azure PowerShell.