Compartir a través de


Iteración de propiedades en plantillas de ARM

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

Solo se puede usar el bucle de copia con recursos de nivel superior, incluso cuando se aplica el bucle de copia a una propiedad. Para obtener información sobre cómo cambiar un recurso secundario a un recurso de nivel superior, consulte Iteración de un recurso secundario.

También puede usar el bucle de copia con recursos, variables 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

Agregue el elemento copy a la sección de recursos de su plantilla para establecer el número de elementos de una propiedad. El elemento copy tiene el siguiente formato general:

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

En name, proporcione el nombre de la propiedad de recurso que desea crear.

La count propiedad especifica el número de iteraciones que desea para la propiedad .

La input propiedad especifica las propiedades que desea repetir. Se crea una matriz de elementos construidos a partir del valor de la input propiedad .

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 propiedades

En el ejemplo siguiente se muestra cómo aplicar el bucle de copia a la dataDisks propiedad en una máquina virtual:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "numberOfDataDisks": {
      "type": "int",
      "minValue": 0,
      "maxValue": 16,
      "defaultValue": 3,
      "metadata": {
        "description": "The number of dataDisks to create."
      }
    },
    ...
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2022-11-01",
      ...
      "properties": {
        "storageProfile": {
          ...
          "copy": [
            {
              "name": "dataDisks",
              "count": "[parameters('numberOfDataDisks')]",
              "input": {
                "lun": "[copyIndex('dataDisks')]",
                "createOption": "Empty",
                "diskSizeGB": 1023
              }
            }
          ]
        }
        ...
      }
    }
  ]
}

Tenga en cuenta que al usar copyIndex dentro de una iteración de propiedad, debe proporcionar el nombre de la iteración. La iteración de propiedades también admite un argumento de desplazamiento. El desplazamiento debe aparecer después del nombre de la iteración, por ejemplo, copyIndex('dataDisks', 1).

La plantilla implementada se convierte en:

{
  "name": "examplevm",
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2020-06-01",
  "properties": {
    "storageProfile": {
      "dataDisks": [
        {
          "lun": 0,
          "createOption": "Empty",
          "diskSizeGB": 1023
        },
        {
          "lun": 1,
          "createOption": "Empty",
          "diskSizeGB": 1023
        },
        {
          "lun": 2,
          "createOption": "Empty",
          "diskSizeGB": 1023
        }
      ],
      ...

La operación de copia resulta útil al trabajar con matrices porque puede recorrer en iteración cada elemento de la matriz. Use la función length de la matriz para especificar el recuento de iteraciones y copyIndex para recuperar el índice actual de la matriz.

En la plantilla de ejemplo siguiente se crea un grupo de conmutación por error para las bases de datos que se pasan como una matriz.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "primaryServerName": {
      "type": "string"
    },
    "secondaryServerName": {
      "type": "string"
    },
    "databaseNames": {
      "type": "array",
      "defaultValue": [
        "mydb1",
        "mydb2",
        "mydb3"
      ]
    }
  },
  "variables": {
    "failoverName": "[format('{0}/{1}failovergroups', parameters('primaryServerName'), parameters('primaryServerName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers/failoverGroups",
      "apiVersion": "2015-05-01-preview",
      "name": "[variables('failoverName')]",
      "properties": {
        "readWriteEndpoint": {
          "failoverPolicy": "Automatic",
          "failoverWithDataLossGracePeriodMinutes": 60
        },
        "readOnlyEndpoint": {
          "failoverPolicy": "Disabled"
        },
        "partnerServers": [
          {
            "id": "[resourceId('Microsoft.Sql/servers', parameters('secondaryServerName'))]"
          }
        ],
        "copy": [
          {
            "name": "databases",
            "count": "[length(parameters('databaseNames'))]",
            "input": "[resourceId('Microsoft.Sql/servers/databases', parameters('primaryServerName'), parameters('databaseNames')[copyIndex('databases')])]"
          }
        ]
      }
    }
  ],
  "outputs": {
  }
}

El copy elemento es una matriz para que pueda especificar más de una propiedad para el recurso.

{
  "type": "Microsoft.Network/loadBalancers",
  "apiVersion": "2017-10-01",
  "name": "exampleLB",
  "properties": {
    "copy": [
      {
        "name": "loadBalancingRules",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      },
      {
        "name": "probes",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      }
    ]
  }
}

Puede usar las iteraciones de recursos y propiedades conjuntamente. Haga referencia a la iteración de la propiedad por el nombre.

{
  "type": "Microsoft.Network/virtualNetworks",
  "apiVersion": "2018-04-01",
  "name": "[format('{0}{1}', parameters('vnetname'), copyIndex())]",
  "copy":{
    "count": 2,
    "name": "vnetloop"
  },
  "location": "[resourceGroup().location]",
  "properties": {
    "addressSpace": {
      "addressPrefixes": [
        "[parameters('addressPrefix')]"
      ]
    },
    "copy": [
      {
        "name": "subnets",
        "count": 2,
        "input": {
          "name": "[format('subnet-{0}', copyIndex('subnets'))]",
          "properties": {
            "addressPrefix": "[variables('subnetAddressPrefix')[copyIndex('subnets')]]"
          }
        }
      }
    ]
  }
}

Plantillas de ejemplo

En el ejemplo siguiente se muestra un escenario común para crear más de un valor para una propiedad.

Plantilla Descripción
Implementación de máquinas virtuales con un número variable de discos de datos Implementa varios discos de datos con una máquina virtual.

Pasos siguientes