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",
    ]
  }
}