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

Terraform遍历Map对象列表报错:无disks属性的解决求助

Terraform遍历disks映射时"Unsupported attribute"错误修复

问题原因

你的local.image.nodes中,vm1没有定义disks属性,但iterate-disks的for循环直接遍历所有VM的vm.disks,导致Terraform处理vm1时找不到该属性触发报错。此外,输出表达式还存在两处变量名错误:

  • 键值部分错误引用了不存在的vm.num变量
  • 错误使用了网络遍历相关的vm.nic_name变量

修复方案

修改iterate-disks输出块,添加条件过滤仅处理包含disks属性的VM,同时修正变量名错误:

locals {
  image = {
    nodes = {
      vm1 = {
        name = "vm1"
        vm_num = "1"
        networks = {
          nic1 = {
            name = "vm1-nic1"
            subnet = "subnet1"
          }
          nic2 = {
            name = "vm1-nic2"
            subnet = "subnet2"
          }
        }
      },
      vm2 = {
        name = "vm2"
        vm_num = "2"
        networks = {
          nic1 = {
            name = "vm2-nic1"
            subnet = "subnet2"

          }
          nic2 = {
            name = "vm2-nic2"
            subnet = "subnet2"

          }
        }
        disks ={
          disk1 = {
            "lun" = "0"
            "size" = "1024"
          },
          disk2 = {
            "lun" = "1"
            "size" = "1024"
          }
        }
      }
    }
  }
}

output "iterate-networks" {
  value = {
    for_each = { for vm in flatten([for vm_name, vm  in local.image.nodes : [for nic_name, nic in vm.networks : { vm_number = vm.vm_num, vm_name = vm_name, nic_name = nic_name, nic_value = nic.name, subnet_name = nic.subnet }]]) : "${vm.vm_name}-${vm.nic_name}" => vm }
  }
}


output "iterate-disks" {
  value = {
    for item in flatten([
      for vm_name, vm in local.image.nodes : [
        for disk_name, disk in lookup(vm, "disks", {}) : {
          vm_number = vm.vm_num
          vm_name   = vm_name
          disk_name = disk_name
          disk_lun  = disk.lun
          disk_size = disk.size
        }
      ] if lookup(vm, "disks", {}) != {}
    ]) : "${item.vm_name}-${item.disk_name}" => item
  }
}

修改说明

  1. 属性存在性检查:用lookup(vm, "disks", {})在VM无disks属性时返回空映射避免报错,同时通过if lookup(vm, "disks", {}) != {}过滤掉无磁盘的VM,减少无效遍历。
  2. 修正键值变量:将原错误的${vm.vm_name}-${vm.num}改为${item.vm_name}-${item.disk_name},确保键名由VM名称和磁盘名称组成,唯一标识每个磁盘项。
  3. 修正变量引用:移除错误的vm.nic_name引用,改用磁盘相关变量构建输出结构。

内容的提问来源于stack exchange,提问作者Uday Kiran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:08:11