Compartir a través de


Iteración de variables en plantillas de ARM

En este artículo se muestra cómo crear más de un valor para una variable en la plantilla de Azure Resource Manager (plantilla de ARM). Al agregar el copy elemento a la sección variables de la plantilla, puede establecer dinámicamente el número de elementos de una variable durante la implementación. También se evita tener que repetir la sintaxis de la plantilla.

También puede utilizar el elemento copy con recursos, propiedades de un recurso y salidas.

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 obtener más información, consulte bucles.

Sintaxis

El elemento copy tiene el siguiente formato general:

"copy": [
  {
    "name": "<name-of-loop>",
    "count": <number-of-iterations>,
    "input": <values-for-the-variable>
  }
]

La name propiedad es cualquier valor que identifica el bucle. La count propiedad especifica el número de iteraciones que desea para la variable.

La input propiedad especifica las propiedades que desea repetir. Se crea una matriz de elementos construidos a partir del valor de la input propiedad . Puede ser una sola propiedad (como una cadena) o un objeto con varias propiedades.

Límites de copia

El recuento no puede superar los 800.

El recuento 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 REST. Específicamente, debe utilizar:

  • Azure PowerShell 2.6 o posterior
  • Azure CLI 2.0.74 o posterior
  • API REST versión 2019-05-10 o posterior
  • Las implementaciones vinculadas deben usar la versión de API 2019-05-10 o posterior para el tipo de recurso de implementación.

Las versiones anteriores de PowerShell, la CLI y la API REST no admiten un recuento de cero.

Iteración de variables

En el ejemplo siguiente se muestra cómo crear una matriz de valores de cadena:

{
  "$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')]"
    }
  }
}

La plantilla anterior devuelve una matriz con los valores siguientes:

[
  "item1",
  "item2",
  "item3",
  "item4",
  "item5"
]

En el ejemplo siguiente se muestra cómo crear una matriz de objetos con tres propiedades: name, diskSizeGBy 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')]"
    }
  }
}

En el ejemplo anterior se devuelve una matriz con los valores siguientes:

[
  {
    "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:

La iteración de variables admite un argumento offset. El desplazamiento debe aparecer después del nombre de la iteración, por ejemplo, copyIndex('diskNames', 1). Si no proporciona un valor de desplazamiento, este se establece en 0 de forma predeterminada en la primera instancia.

También puede usar el copy elemento dentro de una variable. En el ejemplo siguiente se crea un objeto que tiene una matriz como uno de sus 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')]"
    }
  }
}

En el ejemplo anterior se devuelve un objeto con los siguientes 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
    }
  ]
}

En el ejemplo siguiente se muestran las distintas formas de usar copy con variables.

{
  "$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"
    }
  }
}

Plantillas de ejemplo

En los ejemplos siguientes se muestran escenarios comunes para crear más de un valor para una variable.

Plantilla Descripción
Copiar variables Muestra las diferentes maneras de efectuar una iteración en las variables.
Varias reglas de seguridad Implementa varias reglas de seguridad en un grupo de seguridad de red. Construye las reglas de seguridad a partir de un parámetro . Para el parámetro, consulte el archivo de parámetros múltiples de NSG.
Copiar almacenamiento con variables Ejemplo de cómo iterar una variable y crear varias cuentas de almacenamiento.

Pasos siguientes