Terraform 合并地图列表 [英] Terraform merge list of maps
本文介绍了Terraform 合并地图列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的输入如下:
<块引用>list_groups = [{开发 API = {环境= [dev-eu-1",dev-eu-2",]主机= [开发-api-eu1",开发-api-eu2",]}},{开发 API = {环境= [开发-我们-1",开发-我们-2",]主机= [开发-api-us1",开发-api-us2",]}},]
我正在使用如下合并:
<块引用>输出map_groups"{值 = 合并(var.list_groups...)}
我得到的输出是:
<块引用>map_groups = {开发 API = {环境= [开发-我们-1",开发-我们-2",]主机= [开发-api-us1",开发-api-us2",]}}
但我需要输出:
<块引用>map_groups = {开发 API = {环境= [开发-我们-1",开发-我们-2",dev-eu-1",dev-eu-2"]主机= [开发-api-us1",开发-api-us2",开发-api-eu1",dev-api-eu2"]}}
我知道合并正在占用其中一个条目,因为键是相同的,但如果它可以以某种方式合并条目/元素,那就太好了.
解决方案
这是一个相当复杂的问题.我认为你应该专注于简化你的输入数据,而不是试图用一些复杂的 TF 代码来修复你的输入数据结构.然而,TF 代码是:
变量list_groups"{默认 = [{开发 API = {环境= [dev-eu-1",dev-eu-2",]主机= [开发-api-eu1",开发-api-eu2",]}},{开发 API = {环境= [开发-我们-1",开发-我们-2",]主机= [开发-api-us1",开发-api-us2",]}},]}当地人{api_names = distinct([对于 var.list_groups 中的 api: 键(api)[0]])}输出测试"{value = {for key, val in {for api_name in local.api_names:api_name =>{环境=扁平化([对于 var.list_groups 中的 api:api[api_name].envs])主机=扁平化([对于 var.list_groups 中的 api:api[api_name].hosts])}...}: 键 =>价值[0]}}
输出是:
测试 = {开发 API"= {环境"= [dev-eu-1",dev-eu-2",开发-我们-1",开发-我们-2",]主持人"= [开发-api-eu1",开发-api-eu2",开发-api-us1",开发-api-us2",]}}
My input is as below:
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", ] } }, ]
I am using merge as below:
output "map_groups" { value = merge(var.list_groups...) }
And the output I get is :
map_groups = { dev-api = { envs = [ "dev-us-1", "dev-us-2", ] hosts = [ "dev-api-us1", "dev-api-us2", ] } }
But I need the output to be:
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" ] } }
I understand the merge is eating up one of the entries because the key is the same but if it could somehow merge the entries/elements, that'll be great.
解决方案
This is rather complex issue. I think you should concentrate on simplifying your input data, rather then trying to come out with some convoluted TF code to post-fix your input data structures. Nevertheless, the TF code is:
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]}
}
Output is:
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",
]
}
}
这篇关于Terraform 合并地图列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文