如何在Terraform中使用for_each循环遍历嵌套对象映射
问题分析与修复方案
错误原因
你混淆了Terraform中for_each和for表达式的用法:
for_each是资源/模块的元参数,仅用于创建资源时的迭代逻辑,不能用来在输出值里构建集合。- 要在输出中遍历集合生成新的列表/映射,必须使用**
for表达式**,你的写法完全不符合Terraform的表达式语法,导致解析器报错“缺少项分隔符”。
修复代码
根据你获取所有networks下nic元素值的需求,提供两种常见实现方式:
方式1:收集所有nic名称到扁平列表
如果只需要提取所有nic的名称,用嵌套for配合flatten处理嵌套结构:
output "all_nic_names" { value = flatten([ for vm in local.image.nodes : [ for nic in vm.networks : nic.name ] ]) }
执行后输出示例:
all_nic_names = [ "vm1-nic1", "vm1-nic2", "vm2-nic1", "vm2-nic2", ]
方式2:保留VM与nic的层级关联
如果需要保留每个VM对应的nic信息结构,用嵌套映射推导:
output "nic_details_by_vm" { value = { for vm_name, vm in local.image.nodes : vm_name => { for nic_name, nic in vm.networks : nic_name => nic.name } } }
执行后输出示例:
nic_details_by_vm = { "vm1" = { "nic1" = "vm1-nic1" "nic2" = "vm1-nic2" } "vm2" = { "nic1" = "vm2-nic1" "nic2" = "vm2-nic2" } }
关键语法说明
Terraform集合推导的核心规则:
- 列表推导:
[for <item> in <collection> : <expression>] - 映射推导:
{for <key>, <value> in <map> : <new_key> => <new_value>} - 嵌套遍历时,外层与内层
for表达式需正确嵌套,flatten函数可将嵌套列表转为扁平结构。
内容的提问来源于stack exchange,提问作者Uday Kiran
相关产品推荐
相关产品推荐

