使用Terraform csvdecode从CSV创建Azure VM并挂载多数据盘的问题
解决Terraform中CSV驱动的Azure VM数据盘挂载匹配问题
错误原因
azurerm_managed_disk.this的键采用${vm_name}:${data_disk_name}格式(如WEB001:dd01),但附件资源用VM名称(如WEB002)作为索引访问磁盘,键格式不匹配导致索引错误- 附件资源遍历VM列表而非数据盘列表,既会尝试为无数据盘的VM(如WEB002)创建附件,也无法处理单VM多磁盘的场景
解决方案
修改azurerm_virtual_machine_data_disk_attachment的遍历逻辑,直接以数据盘条目为基础,保持与磁盘资源一致的键格式,同时通过数据盘中的vm_name关联到对应VM资源。
修改后的data_disks.tf代码
resource "azurerm_managed_disk" "this" { for_each = { for dd in local.datadisks : "${dd.vm_name}:${dd.data_disk_name}" => dd } name = join("-",[each.value.vm_name,each.value.data_disk_name]) location = local.location resource_group_name = each.value.vm_rg storage_account_type = each.value.storage_account_type create_option = "Empty" disk_size_gb = each.value.disk_size_gb zone = each.value.zone lifecycle { ignore_changes = [tags] } tags = var.tag_custom } resource "azurerm_virtual_machine_data_disk_attachment" "datadisk_attach" { # 遍历数据盘条目,键与磁盘资源完全一致 for_each = { for dd in local.datadisks : "${dd.vm_name}:${dd.data_disk_name}" => dd } managed_disk_id = azurerm_managed_disk.this[each.key].id # 通过数据盘中的vm_name匹配到对应的VM资源 virtual_machine_id = azurerm_windows_virtual_machine.this[each.value.vm_name].id lun = each.value.lun caching = "ReadWrite" depends_on = [ azurerm_managed_disk.this ] }
方案优势
- 每个数据盘条目对应一个独立的附件资源,自动适配单VM多磁盘场景
- 无数据盘的VM不会生成附件资源,彻底避免索引不存在的错误
- 磁盘与附件资源的键完全对齐,保证关联关系准确无误
内容的提问来源于stack exchange,提问作者Nishant Ladiwal
相关产品推荐
相关产品推荐

