List 地形合并地图列表

List 地形合并地图列表,list,maps,terraform,List,Maps,Terraform,我的意见如下: 我正在使用合并,如下所示: 我得到的结果是: 但我需要输出为: 我知道合并正在吞噬其中一个条目,因为键是相同的,但如果它能够以某种方式合并条目/元素,那就太好了。这是一个相当复杂的问题。我认为你应该集中精力简化你的输入数据,而不是试图用一些复杂的TF代码来修复你的输入数据结构。然而,TF代码是: variable "list_groups" { default = [ { dev-api = { envs =

我的意见如下:

我正在使用合并,如下所示:

我得到的结果是:

但我需要输出为:


我知道合并正在吞噬其中一个条目,因为键是相同的,但如果它能够以某种方式合并条目/元素,那就太好了。

这是一个相当复杂的问题。我认为你应该集中精力简化你的输入数据,而不是试图用一些复杂的TF代码来修复你的输入数据结构。然而,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",
    ]
  }
}


不幸的是,大多数语言的map/hash/dict
map
函数将合并一级深度,而不是递归。您必须为此编写自定义lambda。我花了大约十分钟的时间,我认为TF当前的DSL不够健壮,不足以允许编写深度/递归映射合并。您需要能够临时分配上一次迭代的值,这在声明性DSL中可能是不可能的(例如,要在Puppet中实现这一点,您需要一个自定义Ruby函数,因为它也不能直接在其DSL中实现),因为它具有相同的范围变量不变性,这可能是Terraform中一个新的Golang支持的函数。当然,我理解。我将重构现有的数据结构。谢谢你的帮助。
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"
      ]
  }
}
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",
    ]
  }
}