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

如何在Terraform中合并Map类型的值?现有方案遇阻求解决

嘿,我刚好碰到过类似的问题!你应该是在用Terraform v0.11或者更早的版本吧?那个版本里的values()函数确实对map的值类型有局限,只能处理字符串、数字这种基础类型的“扁平”map,没法直接处理值是列表的map。给你两个可行的解决办法:

推荐方案:升级到Terraform v0.12+

从Terraform v0.12开始,官方大幅优化了类型系统和函数支持,values()函数可以完美处理值为复杂类型(比如列表)的map。你现在写的代码其实完全可以直接运行,不需要做任何修改:

variable "records" {
  type = "map"
  default = {
    "mediapop.co."     = ["www.mediapop.co"],
    "mediapopinc.com." = ["mediapopinc.com", "www.mediapopinc.com"],
    "mediapop.sg."     = ["mediapop.sg", "www.mediapop.sg"],
  }
}

output "records" {
  value = "${flatten(values(var.records))}"
}

运行后会输出你想要的扁平化域名列表:

[
  "www.mediapop.co",
  "mediapopinc.com",
  "www.mediapopinc.com",
  "mediapop.sg",
  "www.mediapop.sg"
]

兼容旧版本的方案:手动遍历map

如果暂时没办法升级Terraform版本,也可以通过keys()函数先获取所有map的键,再逐个取出对应的值,最后用flatten()合并成一维列表:

variable "records" {
  type = "map"
  default = {
    "mediapop.co."     = ["www.mediapop.co"],
    "mediapopinc.com." = ["mediapopinc.com", "www.mediapopinc.com"],
    "mediapop.sg."     = ["mediapop.sg", "www.mediapop.sg"],
  }
}

output "records" {
  value = "${flatten([for k in keys(var.records) : var.records[k]])}"
}

这个写法在Terraform v0.11中也能正常工作,核心是通过keys(var.records)拿到所有域名键,遍历每个键取出对应的列表值,最后用flatten()把二维列表转换成一维。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:14:35