【问题标题】:Terraform interpolation for creating a map用于创建地图的 Terraform 插值
【发布时间】:2020-10-17 04:17:06
【问题描述】:

我正在为这种插值而苦苦挣扎,我在下面有一些变量。

primary = ["foo.dev","all.bar.com"]
secondary = ["module.foo.dev","*.foo.dev","all.bar.com"]

我希望我的输出是

{
     "foo.dev" = ["module.foo.dev","*foo.dev"]
     "all.bar.com" = ["all.bar.com"]
}

使用 Terraform 0.12.20

我在 terraform 控制台中尝试过,但无法达到我想要的输出。有什么简单的解决办法吗?

[for i in ["foo.dev","all.bar.com"]: map(i,[for j in ["module.foo.dev","*foo.dev","all.bar.com"]: replace(j,i,"")!=j == true ? j : 0])]
[
  {
    "foo.dev" = [
      "module.foo.dev",
      "*foo.dev",
      "0",
    ]
  },
  {
    "all.bar.com" = [
      "0",
      "0",
      "all.bar.com",
    ]
  },
]

【问题讨论】:

  • 你能解释一下这种关联的逻辑吗……为什么不从一开始就提供正确的地图?

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


【解决方案1】:

您可以使用以下表达式来做到这一点:

{ for i in ["foo.dev", "all.bar.com"] : i => [for j in ["module.foo.dev", "*foo.dev", "all.bar.com"] : j if can(regex(i, j))] }

这会产生以下值:

{
  "all.bar.com" = [
    "all.bar.com",
  ]
  "foo.dev" = [
    "module.foo.dev",
    "*foo.dev",
  ]
}

这正是您所要求的。

迭代解释如下:

首先,指定类型为map:

{}

现在,我们应该遍历第一个列表中的元素:

{ for i in ["foo.dev", "all.bar.com"] : }

接下来,我们将i的值赋给map的key,并为该值初始化一个列表:

{ for i in ["foo.dev", "all.bar.com"] : i => [] }

但是,我们需要将第二个列表中元素的值分配给结果映射的键列表(下面的示例是次优的,因为我们不需要 for 表达式,但它是说明下一步):

{ for i in ["foo.dev", "all.bar.com"] : i => [for j in ["module.foo.dev", "*foo.dev", "all.bar.com"] : j] }

最后,我们要根据键过滤列表值中的元素。我们可以在regex 函数之外使用can 函数来根据是否匹配返回一个布尔值。我们用它来判断第二个列表的元素是否应该添加到值中的列表中:

{ for i in ["foo.dev", "all.bar.com"] : i => [for j in ["module.foo.dev", "*foo.dev", "all.bar.com"] : j if can(regex(i, j))] }

我们已经找到了解决方案。

【讨论】:

    猜你喜欢
    • 2020-09-08
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2020-08-26
    • 2013-08-12
    • 2021-01-31
    相关资源
    最近更新 更多