如何在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
相关产品推荐
相关产品推荐

