Iteração variável em modelos ARM
Este artigo mostra como criar mais de um valor para uma variável no seu modelo do Azure Resource Manager (modelo ARM). Ao adicionar o copy
elemento à seção de variáveis do seu modelo, você pode definir dinamicamente o número de itens para uma variável durante a implantação. Você também evita ter que repetir a sintaxe do modelo.
Você também pode usar copiar com recursos, propriedades em um recurso e saídas.
Gorjeta
Recomendamos o Bicep porque ele oferece os mesmos recursos que os modelos ARM e a sintaxe é mais fácil de usar. Para saber mais, consulte loops.
Sintaxe
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 loop. A count
propriedade especifica o número de iterações que você deseja para a variável.
A input
propriedade especifica as propriedades que você deseja repetir. Você cria uma matriz de elementos construídos a partir do valor na input
propriedade. Pode ser uma única propriedade (como uma cadeia de caracteres) ou um objeto com várias propriedades.
Limites de cópia
A contagem não pode exceder 800.
A contagem não pode ser um número negativo. Pode ser zero se você implantar o modelo com uma versão recente da CLI do Azure, PowerShell ou API REST. Especificamente, você deve usar:
- Azure PowerShell 2.6 ou posterior
- Azure CLI 2.0.74 ou posterior
- API REST versão 2019-05-10 ou posterior
- As implantações vinculadas devem usar a API versão 2019-05-10 ou posterior para o tipo de recurso de implantação
As versões anteriores do PowerShell, CLI e da API REST não suportam zero para contagem.
Iteração variável
O exemplo a seguir mostra como criar uma matriz de valores de cadeia de caracteres:
{
"$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 retorna uma matriz com os seguintes valores:
[
"item1",
"item2",
"item3",
"item4",
"item5"
]
O próximo exemplo 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 retorna 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 deslocamento deve vir após o nome da iteração, como copyIndex('diskNames', 1)
. Se você não fornecer um valor de deslocamento, o padrão será 0 para a primeira instância.
Você também pode usar o copy
elemento dentro de uma variável. O exemplo a seguir cria um objeto que tem uma matriz como um de seus 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 retorna 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 próximo exemplo mostra as diferentes maneiras que você pode usar 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 a seguir mostram cenários comuns para criar mais de um valor para uma variável.
Modelo | Description |
---|---|
Copiar variáveis | Demonstra as diferentes maneiras de iterar em variáveis. |
Várias regras de segurança | Implanta várias regras de segurança em um grupo de segurança de rede. Ele constrói as regras de segurança a partir de um parâmetro. Para obter o parâmetro, consulte vários arquivos de parâmetros NSG. |
Armazenamento de cópias com variáveis | Exemplo de como iterar uma variável e criar várias contas de armazenamento. |
Próximos passos
- Para passar por um tutorial, consulte Tutorial: Criar várias instâncias de recursos com modelos ARM.
- Para outros usos do elemento copy, consulte:
- Se você quiser saber mais sobre as seções de um modelo, consulte Compreender a estrutura e a sintaxe dos modelos ARM.
- Para saber como implantar seu modelo, consulte Implantar recursos com modelos ARM e Azure PowerShell.