ARM 模板中的变量迭代
本文展示了如何为 Azure 资源管理器模板(ARM 模板)中的变量创建多个值。 通过将 copy
元素添加到模板的 variables 节,可以在部署过程中动态设置变量的项数。 还可以避免重复模板语法。
语法
copy 元素采用以下常规格式:
"copy": [
{
"name": "<name-of-loop>",
"count": <number-of-iterations>,
"input": <values-for-the-variable>
}
]
name
属性是标识循环的任何值。 count
属性指定你希望该变量迭代的次数。
input
属性指定要重复的属性。 可以创建一个由 input
属性中的值构造的元素数组。 它可以是单个属性(例如字符串),也可以是具有多个属性的对象。
复制限制
count 不能超过 800。
count 不能为负数。 如果使用最新版本的 Azure CLI、PowerShell 或 REST API 部署模板,则它可以为零。 具体而言,必须使用:
- Azure PowerShell 2.6 或更高版本
- Azure CLI 2.0.74 或更高版本
- REST API 版本 2019-05-10 或更高版本
- 链接的部署必须将 API 版本 2019-05-10 或更高版本用于部署资源类型
更早版本的 PowerShell、CLI 和 REST API 不支持将 count 设为零。
变量迭代
以下示例展示了如何创建字符串值的数组:
{
"$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')]"
}
}
}
前面的模板返回包含以下值的数组:
[
"item1",
"item2",
"item3",
"item4",
"item5"
]
下一个示例演示如何创建具有三个属性(name
、diskSizeGB
和 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')]"
}
}
}
前面的示例返回包含以下值的数组:
[
{
"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
}
]
备注
变量迭代支持偏移量参数。 偏移量必须在迭代名称之后,例如 copyIndex('diskNames', 1)
。 如果未提供偏移量值,对于第一个实例,它将默认为 0。
还可以在变量内使用 copy
元素。 以下示例创建一个使用数组作为其值之一的对象。
{
"$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')]"
}
}
}
前面的示例返回包含以下值的对象:
{
"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
}
]
}
下一示例显示了可以将 copy
用于变量的各种方式。
{
"$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"
}
}
}
示例模板
以下示例显示了为一个变量创建多个值的常见方案。
模板 | 说明 |
---|---|
复制变量 | 演示循环访问变量的不同方式。 |
多项安全规则 | 将多个安全规则部署到网络安全组。 它从参数构造安全规则。 有关参数,请参阅多个 NSG 参数文件。 |
复制带有变量的存储 | 关于如何循环访问变量以及创建多个存储帐户的示例。 |
后续步骤
- 若要完成教程,请参阅教程:使用 ARM 模板创建多个资源实例。
- 有关 copy 元素的其他用法,请参阅:
- 若要了解模板的各个部分,请参阅了解 ARM 模板的结构和语法。
- 若要了解如何部署模板,请参阅使用 ARM 模板和 Azure PowerShell 来部署资源。