Terraform带count索引的模块调用:VM数据盘挂载ID引用问题
解决方案
子模块配置:输出VM ID列表
在你的VM子模块中,无需在输出中使用count,直接通过[*]操作符将带count的VM资源ID转换为列表输出即可:
# 子模块内的输出定义 output "vm_ids" { type = list(string) description = "已创建虚拟机的ID列表" value = azurerm_virtual_machine.vm[*].id }
这里的azurerm_virtual_machine.vm是子模块中创建VM的资源名称,[*]会自动遍历所有count实例,提取对应id属性并生成列表。
根模块配置:引用子模块的VM ID列表
在根模块的磁盘挂载资源中,通过count.index索引子模块输出的vm_ids列表,就能匹配到对应VM的ID:
resource "azurerm_virtual_machine_data_disk_attachment" "ddisk-b_attach" { count = var.instance_count managed_disk_id = azurerm_managed_disk.ddisk01[count.index].id virtual_machine_id = module.virtual_machine.vm_ids[count.index] lun = "1" caching = "ReadWrite" depends_on = [module.virtual_machine] }
优化建议:同步count值
为避免子模块与根模块count值不一致导致的索引越界问题,推荐将磁盘挂载的count设置为子模块输出列表的长度,而非直接使用var.instance_count:
count = length(module.virtual_machine.vm_ids)
这样无论子模块创建多少台VM,磁盘挂载资源都会自动匹配数量,保证一一对应。
原理说明
Terraform中带count的资源本身是列表类型的资源集合,[*]操作符可提取集合中所有实例的指定属性生成列表。子模块输出该列表后,根模块即可通过索引访问每个VM的ID,完美适配磁盘挂载的count循环需求。
内容的提问来源于stack exchange,提问作者boarderyogi
相关产品推荐
相关产品推荐

