【问题标题】:Get the index of a set inside of a dynamic block获取动态块内集合的索引
【发布时间】:2021-09-01 09:19:35
【问题描述】:

我正在尝试获取集合的索引。看这里的例子:Terraform get list index on for_each

不过,这似乎不适用于动态块。键和值仍然是相同的值。如何获取动态块中集合中某项的索引号?

  dynamic "set" {
    for_each   = { for idx, item in var.myset: item => idx}
    content {
      name  = "Company----${set.key}"
      value = "Company----${set.value}"
    }
  }

【问题讨论】:

    标签: terraform terraform0.12+


    【解决方案1】:

    您无法根据Terraform's documentation on dynamic blocks 获取集合中项目的索引号。

    key 是当前元素的映射键或列表元素索引。如果 for_each 表达式产生一个设置值,则 key 与 value 相同,不应使用。

    你可能觉得有更好的方法可以解决这个问题。但由于不了解您想要实现的全部范围,我也了解有时 Terraform 需要我们跳过一些有趣的环节。

    如果您像上面那样在动态块中获取集合索引及其值是死心塌地,那么您可以将集合转换为将索引分配为键的映射。

    这样的事情应该可以工作。

    zipmap(range(length(var.myset)), var.myset)
    

    然后您可以在 for_each 块中使用生成的地图。这应该让 set.key 产生当前索引(由 range 函数构造),而 set.value 产生包含在集合中的值。

    需要注意的重要一点是,与列表不同,集合没有排序,因此它们本身没有索引。这就是为什么你不能像上面的例子那样使用索引函数。这也是我使用 range 函数构建索引的原因。

    您也可能需要将集合显式转换为列表 - Terraform 应该进行隐式转换。但有时它应该做什么和它做什么并不总是一致的。在这种情况下,语句将如下所示。

    zipmap(range(length(var.myset)), toList(var.myset))
    

    Terraform's documentation on types 中也对此进行了说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多