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

Terraform合并locals中创建的列表报错,如何正确合并传至模块?

问题解决:Terraform合并列表传递给模块

错误根源分析

你的代码存在两个关键问题:

  1. 本地值引用错误:在locals块内引用其他本地值必须加上local.前缀,否则Terraform会将其误认为是资源类型引用,触发Invalid reference错误。
  2. setunion函数使用场景不符:setunion用于合并集合(set),且集合元素必须是可哈希类型(如字符串、数字、tuple)。而你定义的nodes_to_create和controller_to_create是列表(list),且元素本身是不可哈希的列表类型,直接用setunion会导致类型不兼容。

解决方案

根据你的需求(合并列表传递给模块),分两种场景处理:

场景1:仅合并列表(无需去重)

如果确定两个列表内的元素不会重复,直接使用concat函数合并即可,这是最直接的方式:

variable "number_of_nodes" {
  default = 5
}

locals {
  nodes_to_create      = [for node in range(var.number_of_nodes) : ["k8s-node-${node}", false]]
  controller_to_create = [["k8s-ctl", true]]
  # 使用concat合并两个列表,注意加上local.前缀引用本地值
  vms_to_create        = concat(local.nodes_to_create, local.controller_to_create)
}

output "test1" {
  value = local.controller_to_create
}

output "test2" {
  value = local.nodes_to_create
}

output "test3" {
  value = local.vms_to_create
}

场景2:合并并去重

如果需要确保合并后的列表无重复元素,需先将元素转换为可哈希的tuple类型,再通过setunion去重,最后转回列表:

variable "number_of_nodes" {
  default = 5
}

locals {
  # 将元素转为tuple(可哈希类型)
  nodes_to_create      = [for node in range(var.number_of_nodes) : tuple(["k8s-node-${node}", false])]
  controller_to_create = [tuple(["k8s-ctl", true])]
  # 先转集合去重,再转回列表
  vms_to_create        = tolist(setunion(local.nodes_to_create, local.controller_to_create))
}

output "test1" {
  value = local.controller_to_create
}

output "test2" {
  value = local.nodes_to_create
}

output "test3" {
  value = local.vms_to_create
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:42:53