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

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
}

为什么之前的写法无效?

  1. 模块内循环google_compute_instance.k3s-master.name:name是字符串类型,循环字符串会遍历每个字符,完全不符合预期。
  2. 根模块循环module.master-nodes:module.master-nodes是Map,直接循环会遍历键值对而非模块实例对象,必须用values()提取所有实例值后再操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:42:43