【问题标题】:Preserve list ordering when creating maps in Terraform 0.12?在 Terraform 0.12 中创建地图时保留列表顺序?
【发布时间】:2021-01-23 20:23:36
【问题描述】:

我的配置中有以下 sn-ps - 想法是将当前逻辑/语法从 0.11 更改为 0.12。首先,我正在从列表中创建地图,

my_vars = zipmap(
  var.foo_vars,
  flatten(data.terraform_remote_state.foo.*.outputs.some_id)
)

然后对其进行迭代以生成一些键值对。

...
"var": [for key in keys(local.my_vars) :
  {
    name  = key
    value = lookup(local.my_vars, key)
  }
],
...

这是相关的 tfvars 配置。

foo_vars = [
    "A",
    "B",
    "C"
]

问题是这个逻辑似乎并没有保留顺序,我想不出一个好的方法来实现这一点。据我了解,一旦您将列表转换为带有zipmap 的地图,就会重新计算订单。有什么办法可以保留原始订单?

我不依赖于当前的解决方案,所以也许有一种方法可以生成不需要首先创建地图的键/值,并且可以只使用两个列表来完成?

~ foo          = [
                        {
                            name  = "A"
                            value = "1"
                        },
                      - {
                          - name  = "B"
                          - value = "2"
                        },
                        {
                            name  = "C"
                            value = "3"
                        },
                      + {
                          + name      = "B"
                          + valueFrom = "2"
                        },
                    ]

【问题讨论】:

  • i 可能不正确,但我相信在该语法中迭代会隐式地将 list 类型转换为无序的 set 类型,因此无论如何都会丢失排序。

标签: terraform terraform-provider-aws terraform0.12+


【解决方案1】:

这里重要的是,正如您所注意到的,Terraform 的地图类型是一个无序的地图,它仅通过键来识别元素,而不是通过权限。因此,如果您遇到需要保留序列顺序的情况,则映射不是适合使用的数据结构。

我怀疑保持有序可能实际上并不是解决您的根本问题所必需的,但我无法从您分享的信息中看出所有这些值的实际含义是什么,所以我将假设您确实需要保留订单。如果您仅因为使用count 创建资源的多个实例而使用有序序列,我建议您考虑改用resource for_each,这可能使您能够以一种不是对var.foo_vars中的项目顺序敏感。


给定两个长度相同的列表,您可以通过编写 for expression 来生成一个新列表,该列表将每个列表中的相应元素组合在一起,如下所示:

locals {
  my_vars = [
    for i, some_id in data.terraform_remote_state.foo.*.outputs.some_id : {
      name  = var.foo_vars[i]
      value = some_id
    }
  ]
}

以上依赖于一个列表中的i索引值与另一个列表中相同索引的元素相关的事实,因此我们可以使用数据源实例中的i来访问相应的var.foo_vars 的元素。

【讨论】:

    猜你喜欢
    • 2020-08-11
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2014-05-21
    相关资源
    最近更新 更多