Terraform中for_each模块输出无法传入其他模块的问题咨询
解决Terraform模块间实例名称/self_link传递问题
核心问题原因
你在master-nodes模块中使用了for_each,这会让module.master-nodes变成一个键值对集合(Map),而非单个模块实例对象。之前的写法错误在于没有处理这种Map结构,导致无法正确提取实例属性。
步骤1:修正master-nodes模块的输出
每个master-nodes模块实例只对应一台GCE实例,直接输出该实例的名称(或self_link)即可,不需要额外循环:
# ./master-nodes/outputs.tf output "instance_name" { value = google_compute_instance.k3s-master.name description = "单台master节点实例的名称" } # 如果需要传递self_link,新增这个输出 output "instance_self_link" { value = google_compute_instance.k3s-master.self_link description = "单台master节点实例的self_link" }
步骤2:在根模块中正确提取所有实例属性
利用values()函数取出module.master-nodes这个Map中的所有模块实例值,再通过展开操作提取目标属性:
# 根模块main.tf module "master-nodes" { source = "./master-nodes" network = google_compute_network.k3s.self_link project = var.project service_account = var.service_account ssh = var.ssh for_each = var.servers name = each.key subnet_name = each.key region = each.value.region cidr_range = each.value.cidr_range machine_type = each.value.machine_type } module "networking" { source = "./networking" network = google_compute_network.k3s.self_link # 提取所有master节点的名称列表 instance_names = values(module.master-nodes)[*].instance_name # 如果需要传递self_link列表,替换为下面这行 # instance_self_links = values(module.master-nodes)[*].instance_self_link }
为什么之前的写法无效?
- 模块内循环
google_compute_instance.k3s-master.name:name是字符串类型,循环字符串会遍历每个字符,完全不符合预期。 - 根模块循环
module.master-nodes:module.master-nodes是Map,直接循环会遍历键值对而非模块实例对象,必须用values()提取所有实例值后再操作。
内容的提问来源于stack exchange,提问作者user38643
相关产品推荐
相关产品推荐

