Terraform 合并地图列表 [英] Terraform merge list of maps

查看:19
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆