用于创建地图的地形插值

时间:2020-06-26 14:22:19

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

我正在努力进行插值,下面有类似的变量。

by viewModels

我希望输出为

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

使用Terraform 0.12.20

我在terraform控制台中尝试过,但无法实现所需的输出。有什么简单的解决方法吗?

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

1 个答案:

答案 0 :(得分: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",
  ]
}

这正是您的要求。

迭代解释如下:

首先,指定类型为地图:

{}

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

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

接下来,我们将i值分配给地图的键,并为该值初始化一个列表:

{ 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] }

最后,我们要基于键过滤列表值中的元素。我们可以在can函数之外使用regex函数,根据是否匹配返回布尔值。我们以此为条件,确定是否应将第二个列表的元素添加到值的列表中:

{ 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))] }

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