Iteración de salida en las plantillas de ARM
En este artículo se muestra cómo crear más de un valor para una salida en la plantilla de Azure Resource Manager (plantilla de ARM). Al agregar un bucle de copia a la sección de salidas de la plantilla, puede devolver de forma dinámica varios elementos durante la implementación.
También puede usar el bucle de copia con recursos, propiedades de un recurso y variables.
Sugerencia
Se recomienda Bicep porque ofrece las mismas funcionalidades que las plantillas de ARM y la sintaxis es más fácil de usar. Para más información, consulta loops.
Syntax
Agregue el elemento copy
a la sección de salida de la plantilla para devolver el número de elementos. El elemento copy tiene el siguiente formato general:
"copy": {
"count": <number-of-iterations>,
"input": <values-for-the-output>
}
La propiedad count
especifica el número de iteraciones que quiere para el valor de salida.
La propiedad input
especifica las propiedades que desea repetir. Tiene que crear una matriz de elementos construida a partir del valor de la propiedad input
. Puede tratarse de una propiedad única (como una cadena) o de un objeto con varias propiedades.
Límites de copia
El valor de count no puede superar 800.
El valor de count no puede ser un número negativo. Puede ser cero si implementa la plantilla con una versión reciente de la CLI de Azure, PowerShell o la API de REST. Concretamente, se debe usar:
- Azure PowerShell 2.6 o posterior
- CLI de Azure 2.0.74 o posterior
- API de REST versión 2019-05-10 o posterior
- Las implementaciones vinculadas deben usar la versión 10-05-2019 o posterior de la API para el tipo de recurso de implementación
Las versiones anteriores de PowerShell, la CLI y API REST no admiten un valor de count de cero.
Iteración de salidas
En el ejemplo siguiente se crea un número variable de cuentas de almacenamiento y se devuelve un punto de conexión para cada cuenta de almacenamiento:
{
"$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]"
}
}
}
}
La plantilla anterior devuelve una matriz con los siguientes valores:
[
"https://0storagecfrbqnnmpeudi.blob.core.windows.net/",
"https://1storagecfrbqnnmpeudi.blob.core.windows.net/"
]
En el ejemplo siguiente se devuelven tres propiedades de las nuevas cuentas de almacenamiento.
{
"$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]"
}
}
}
}
}
El ejemplo anterior devuelve una matriz con los valores siguientes:
[
{
"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"
}
]
Pasos siguientes
- Para realizar un tutorial, consulte Tutorial: Creación de varias instancias de recursos con plantillas de Resource Manager.
- Para otros usos del bucle de copia, consulte:
- Si quiere obtener más información sobre las secciones de una plantilla, vea Nociones sobre la estructura y la sintaxis de las plantillas de Azure Resource Manager.
- Para información sobre cómo implementar una plantilla, consulte Implementación de recursos con las plantillas de Resource Manager y Azure PowerShell.