Terraform合并locals中创建的列表报错,如何正确合并传至模块?
问题解决:Terraform合并列表传递给模块
错误根源分析
你的代码存在两个关键问题:
- 本地值引用错误:在
locals块内引用其他本地值必须加上local.前缀,否则Terraform会将其误认为是资源类型引用,触发Invalid reference错误。 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
相关产品推荐
相关产品推荐

