如何获取Bicep中循环调用模块的输出变量
Bicep循环部署模块时获取输出变量的方法
核心规则
当你使用for循环批量创建模块实例时,最终得到的模块对象是和输入循环源长度一致的数组,数组项顺序和循环输入的数组顺序完全对应:
- 数组每个元素对应单次循环部署的模块实例
- 直接通过数组下标定位到对应模块实例后,访问实例的
outputs属性,即可拿到子模块中定义的所有输出值 - 不支持直接对循环生成的模块数组整体读取输出,必须明确指定下标,否则会触发编译报错
针对你虚拟网络加子网场景的实现示例
你原有循环部署vnet的代码不需要修改,后续添加子网时,只需要在子网的部署逻辑中通过下标匹配对应vnet的输出即可,参考代码如下:
// 原有vnet循环部署代码保持不变 module vnet01 'vNet.bicep' = [ for vnet in vnets : { name: vnet.name scope: virtualNetworkRg params: { vnetName: vnet.name vnetAddressPrefix: vnet.vnetAddressPrefix location: location } }] // 新增:批量为每个vnet部署对应子网 module vnetSubnets 'subnet.bicep' = [ for (vnetConfig, index) in vnets : { name: '${vnetConfig.name}-subnet-deploy' scope: virtualNetworkRg params: { // 通过下标匹配同位置的vnet模块输出,拿到vnet资源ID targetVnetId: vnet01[index].outputs.id subnetName: vnetConfig.subnet.name subnetAddressPrefix: vnetConfig.subnet.addressPrefix } }]
如果你只需要给某一个特定vnet添加子网,直接按vnet在vnets数组中的位置取对应下标即可,例如获取第一个部署的vnet的ID,写法为vnet01[0].outputs.id。
提示:子模块中定义的所有输出变量都遵循这个访问规则,比如你后续在vNet.bicep里新增输出vnet名称、地址段等内容,都可以通过
模块数组[下标].outputs.输出名的格式直接引用。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

