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)

后续步骤