Iteração de saída em modelos ARM
Este artigo mostra como criar mais de um valor para uma saída no modelo do ARM (modelo do Azure Resource Manager). Ao adicionar o loop de cópia à seção de saídas do seu modelo, você pode retornar dinamicamente vários itens durante a implantação.
Você também pode usar o loop de cópia com recursos, propriedades em um recurso e com variáveis.
Dica
Recomendamos o Bicep porque ele oferece as mesmas funcionalidades que os modelos do ARM e a sintaxe é mais fácil de usar. Para saber mais, confira loops.
Syntax
Adicione o elemento copy
à seção de saída do seu modelo para retornar uma certa quantidade de itens. O elemento de cópia tem o seguinte formato geral:
"copy": {
"count": <number-of-iterations>,
"input": <values-for-the-output>
}
A propriedade count
especifica o número de iterações que você deseja para o valor da saída.
A propriedade input
especifica as propriedades que você deseja repetir. Crie uma matriz de elementos construídos a partir do valor na propriedade input
. Pode ser uma 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. Ela pode ser zero se você implantar o modelo com uma versão recente da CLI do Azure, do PowerShell ou da API REST. Especificamente, você deve usar:
- Azure PowerShell 2.6 ou posterior
- CLI do Azure 2.0.74 ou posterior
- API REST versão 10-05-2019 ou posterior
- As implantações vinculadas devem usar a versão de API 10-05-2019 ou posterior para o tipo de recurso de implantação
As versões anteriores do PowerShell, da CLI e da API REST não têm suporte para zero como contagem.
Iteração de saídas
O exemplo a seguir cria um número de variável de contas de armazenamento e retorna um ponto de extremidade para cada conta de armazenamento:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageCount": {
"type": "int",
"defaultValue": 2
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"variables": {
"baseName": "[format('storage{0}', uniqueString(resourceGroup().id))]"
},
"resources": [
{
"copy": {
"name": "storagecopy",
"count": "[parameters('storageCount')]"
},
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-09-01",
"name": "[format('{0}{1}', copyIndex(), variables('baseName'))]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "Storage",
"properties": {}
}
],
"outputs": {
"storageEndpoints": {
"type": "array",
"copy": {
"count": "[parameters('storageCount')]",
"input": "[reference(format('{0}{1}', copyIndex(), variables('baseName'))).primaryEndpoints.blob]"
}
}
}
}
O modelo anterior retorna uma matriz com os seguintes valores:
[
"https://0storagecfrbqnnmpeudi.blob.core.windows.net/",
"https://1storagecfrbqnnmpeudi.blob.core.windows.net/"
]
O próximo exemplo retorna três propriedades das novas contas de armazenamento.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageCount": {
"type": "int",
"defaultValue": 2
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"variables": {
"baseName": "[format('storage{0}', uniqueString(resourceGroup().id))]"
},
"resources": [
{
"copy": {
"name": "storagecopy",
"count": "[length(range(0, parameters('storageCount')))]"
},
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-09-01",
"name": "[format('{0}{1}', range(0, parameters('storageCount'))[copyIndex()], variables('baseName'))]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "Storage",
"properties": {}
}
],
"outputs": {
"storageInfo": {
"type": "array",
"copy": {
"count": "[length(range(0, parameters('storageCount')))]",
"input": {
"id": "[resourceId('Microsoft.Storage/storageAccounts', format('{0}{1}', copyIndex(), variables('baseName')))]",
"blobEndpoint": "[reference(format('{0}{1}', copyIndex(), variables('baseName'))).primaryEndpoints.blob]",
"status": "[reference(format('{0}{1}', copyIndex(), variables('baseName'))).statusOfPrimary]"
}
}
}
}
}
O exemplo anterior retorna uma matriz com os seguintes valores:
[
{
"id": "/subscriptions/00000000/resourceGroups/demoGroup/providers/Microsoft.Storage/storageAccounts/0storagecfrbqnnmpeudi",
"blobEndpoint": "https://0storagecfrbqnnmpeudi.blob.core.windows.net/",
"status": "available"
},
{
"id": "/subscriptions/00000000/resourceGroups/demoGroup/providers/Microsoft.Storage/storageAccounts/1storagecfrbqnnmpeudi",
"blobEndpoint": "https://1storagecfrbqnnmpeudi.blob.core.windows.net/",
"status": "available"
}
]
Próximas etapas
- Para passar por um tutorial, confira Tutorial: Criar várias instâncias de recurso com os modelos do ARM.
- Para outros usos do loop de cópia, confira:
- Se você quiser saber mais sobre as seções de um modelo, confira Noções básicas de estrutura e sintaxe de modelos do ARM.
- Para saber como implantar seu modelo, confira Implantar recursos com modelos do ARM e o Azure PowerShell.