Terraform 合并地图列表
Terraform merge list of maps
我的输入如下:
list_groups = [
{
dev-api = {
envs = [
"dev-eu-1",
"dev-eu-2",
]
hosts = [
"dev-api-eu1",
"dev-api-eu2",
]
}
},
{
dev-api = {
envs = [
"dev-us-1",
"dev-us-2",
]
hosts = [
"dev-api-us1",
"dev-api-us2",
]
}
},
]
我正在使用合并如下:
output "map_groups" {
value = merge(var.list_groups...)
}
我得到的输出是:
map_groups = {
dev-api = {
envs = [
"dev-us-1",
"dev-us-2",
]
hosts = [
"dev-api-us1",
"dev-api-us2",
]
}
}
但我需要输出为:
map_groups = {
dev-api = {
envs = [
"dev-us-1",
"dev-us-2",
"dev-eu-1",
"dev-eu-2"
]
hosts = [
"dev-api-us1",
"dev-api-us2",
"dev-api-eu1",
"dev-api-eu2"
]
}
}
我知道合并正在吃掉其中一个条目,因为密钥是相同的,但如果它能以某种方式合并 entries/elements,那就太好了。
这是一个相当复杂的问题。我认为您应该专注于简化输入数据,而不是尝试使用一些复杂的 TF 代码来 post-修复您的输入数据结构。尽管如此,TF代码是:
variable "list_groups" {
default = [
{
dev-api = {
envs = [
"dev-eu-1",
"dev-eu-2",
]
hosts = [
"dev-api-eu1",
"dev-api-eu2",
]
}
},
{
dev-api = {
envs = [
"dev-us-1",
"dev-us-2",
]
hosts = [
"dev-api-us1",
"dev-api-us2",
]
}
},
]
}
locals {
api_names = distinct([for api in var.list_groups: keys(api)[0]])
}
output "test" {
value = {for key, val in {for api_name in local.api_names:
api_name => {
envs = flatten([
for api in var.list_groups:
api[api_name].envs
])
hosts = flatten([
for api in var.list_groups:
api[api_name].hosts
])
}...
}: key => val[0]}
}
输出为:
test = {
"dev-api" = {
"envs" = [
"dev-eu-1",
"dev-eu-2",
"dev-us-1",
"dev-us-2",
]
"hosts" = [
"dev-api-eu1",
"dev-api-eu2",
"dev-api-us1",
"dev-api-us2",
]
}
}
我的输入如下:
list_groups = [ { dev-api = { envs = [ "dev-eu-1", "dev-eu-2", ] hosts = [ "dev-api-eu1", "dev-api-eu2", ] } }, { dev-api = { envs = [ "dev-us-1", "dev-us-2", ] hosts = [ "dev-api-us1", "dev-api-us2", ] } }, ]
我正在使用合并如下:
output "map_groups" { value = merge(var.list_groups...) }
我得到的输出是:
map_groups = { dev-api = { envs = [ "dev-us-1", "dev-us-2", ] hosts = [ "dev-api-us1", "dev-api-us2", ] } }
但我需要输出为:
map_groups = { dev-api = { envs = [ "dev-us-1", "dev-us-2", "dev-eu-1", "dev-eu-2" ] hosts = [ "dev-api-us1", "dev-api-us2", "dev-api-eu1", "dev-api-eu2" ] } }
我知道合并正在吃掉其中一个条目,因为密钥是相同的,但如果它能以某种方式合并 entries/elements,那就太好了。
这是一个相当复杂的问题。我认为您应该专注于简化输入数据,而不是尝试使用一些复杂的 TF 代码来 post-修复您的输入数据结构。尽管如此,TF代码是:
variable "list_groups" {
default = [
{
dev-api = {
envs = [
"dev-eu-1",
"dev-eu-2",
]
hosts = [
"dev-api-eu1",
"dev-api-eu2",
]
}
},
{
dev-api = {
envs = [
"dev-us-1",
"dev-us-2",
]
hosts = [
"dev-api-us1",
"dev-api-us2",
]
}
},
]
}
locals {
api_names = distinct([for api in var.list_groups: keys(api)[0]])
}
output "test" {
value = {for key, val in {for api_name in local.api_names:
api_name => {
envs = flatten([
for api in var.list_groups:
api[api_name].envs
])
hosts = flatten([
for api in var.list_groups:
api[api_name].hosts
])
}...
}: key => val[0]}
}
输出为:
test = {
"dev-api" = {
"envs" = [
"dev-eu-1",
"dev-eu-2",
"dev-us-1",
"dev-us-2",
]
"hosts" = [
"dev-api-eu1",
"dev-api-eu2",
"dev-api-us1",
"dev-api-us2",
]
}
}