Bicep 中的模块迭代
本文展示了如何在 Bicep 文件中部署多个模块实例。 可以在 module
声明中添加循环,并动态设置部署该模块的次数。 避免在 Bicep 文件中重复语法。
语法
可通过以下方式使用循环来声明多个模块:
使用循环索引。
module <module-symbolic-name> '<module-file>' = [for <index> in range(<start>, <stop>): { <module-properties> }]
有关详细信息,请参阅循环索引。
循环访问数组。
module <module-symbolic-name> '<module-file>' = [for <item> in <collection>: { <module-properties> }]
有关详细信息,请参阅循环数组。
循环访问数组和索引:
module <module-symbolic-name> 'module-file' = [for (<item>, <index>) in <collection>: { <module-properties> }]
循环限制
Bicep 文件的循环迭代不能为负数,也不能超过 800 次。
循环索引
以下示例按照 storageCount
参数中指定的次数部署模块。 该模块的每个实例都创建一个存储帐户。
param location string = resourceGroup().location
param storageCount int = 2
var baseName = 'store${uniqueString(resourceGroup().id)}'
module stgModule './storageAccount.bicep' = [for i in range(0, storageCount): {
name: '${i}storage${baseName}'
params: {
storageName: '${i}${baseName}'
location: location
}
}]
请注意,创建存储帐户资源名称时将使用索引 i
。 存储帐户作为参数值传递给模块。
循环数组
以下示例针对 storageNames
参数中提供的每个名称部署模块。 该模块会创建一个存储帐户
param rgLocation string = resourceGroup().location
param storageNames array = [
'contoso'
'fabrikam'
'coho'
]
module stgModule './storageAccount.bicep' = [for name in storageNames: {
name: '${name}${uniqueString(resourceGroup().id)}'
params: {
storageName: name
location: location
}
}]
输出循环中不支持引用模块集合。 若要从集合中的模块输出结果,请将数组索引器应用于表达式。 有关详细信息,请参阅输出迭代。
具有条件的模块迭代
下面的示例展示了一个带有经过筛选的模块循环的 Bicep 文件。 筛选器必须是计算结果为布尔值的表达式。
param location string = resourceGroup().location
param storageCount int = 2
param createNewStorage bool = true
var baseName = 'store${uniqueString(resourceGroup().id)}'
module stgModule './storageAccount.bicep' = [for i in range(0, storageCount): if(createNewStorage) {
name: '${i}storage${baseName}'
params: {
storageName: '${i}${baseName}'
location: location
}
}]
在上述示例中,只有在布尔值为 true
时,才调用模块。
筛选器也支持资源循环。
批量部署
默认情况下,资源管理器并行创建资源。 使用循环创建多个资源类型实例时,将同时部署这些实例。 不会保证它们的创建顺序。 除了 Bicep 文件中的资源总数为 800 这一限制外,并行部署的资源数量没有限制。
你可能不希望同时更新资源类型的所有实例。 例如,在更新生产环境时,可能需要错开更新,使任何一次仅更新一定数量。 可指定同时批处理和部署其中一部分实例。 其他实例等待该批处理完成。
若要串行部署模块的实例,请添加 batchSize 修饰器。 将其值设置为要并发部署的实例数。 在循环中创建先前实例的依赖关系,使其在上一个批处理完成后才启动批处理。
param location string = resourceGroup().location
@batchSize(2)
module stgModule './storageAccount.bicep' = [for i in range(0, 4): {
name: '${i}storage${uniqueString(resourceGroup().id)}'
params: {
storageName: '${i}${baseName}'
location: location
}
}]
对于纯顺序部署,将批大小设置为 1。
batchSize
修饰器位于 sys 命名空间中。 如果需要将此修饰器与具有相同名称的其他项区分开来,请在修饰器前面加上 sys:@sys.batchSize(2)
后续步骤
- 有关循环的其他用法,请参阅:
- 若要详细了解模块,请参阅使用 Bicep 模块。
- 若要设置对循环中创建的资源的依赖关系,请参阅设置资源依赖关系。