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 } }
修改说明
- 属性存在性检查:用
lookup(vm, "disks", {})在VM无disks属性时返回空映射避免报错,同时通过if lookup(vm, "disks", {}) != {}过滤掉无磁盘的VM,减少无效遍历。 - 修正键值变量:将原错误的
${vm.vm_name}-${vm.num}改为${item.vm_name}-${item.disk_name},确保键名由VM名称和磁盘名称组成,唯一标识每个磁盘项。 - 修正变量引用:移除错误的
vm.nic_name引用,改用磁盘相关变量构建输出结构。
内容的提问来源于stack exchange,提问作者Uday Kiran
相关产品推荐
相关产品推荐

