You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:24:50