在Terraform 0.12中组合两个地图以创建第三个地图

在Terraform 0.12中组合两个地图以创建第三个地图,terraform,terraform0.12+,Terraform,Terraform0.12+,我需要在Terraform 0.12中对输入数据进行一些复杂的合并。我不知道这是否可能,但也许我只是做错了什么 我有两个变量: 变量“ebs\U块\U设备”{ description=“附加到实例的其他EBS块设备” 类型=列表(映射(字符串)) 默认值=[ { 设备名称=“/dev/sdg” 体积大小=5 卷类型=“gp2” 在终止时删除\u=false }, { 设备名称=“/dev/sdh” 体积大小=5 卷类型=“gp2” 在终止时删除\u=false } ] } 变量“mount_po

我需要在Terraform 0.12中对输入数据进行一些复杂的合并。我不知道这是否可能,但也许我只是做错了什么

我有两个变量:

变量“ebs\U块\U设备”{
description=“附加到实例的其他EBS块设备”
类型=列表(映射(字符串))
默认值=[
{
设备名称=“/dev/sdg”
体积大小=5
卷类型=“gp2”
在终止时删除\u=false
},
{
设备名称=“/dev/sdh”
体积大小=5
卷类型=“gp2”
在终止时删除\u=false
}
]
}
变量“mount_point”{
description=“要使用的装载点”
类型=列表(字符串)
默认值=[“/data”,“/home”]
}
然后,我想将这些源合并到一个模板中,如下所示:

#/usr/bin/env bash
%{对于合并~}中的e
mkfs-t xfs${e.device_name}
mkdir-p${e.mount_point}
mount${e.device\u name}${e.mount\u point}
%{endfor}
其中,
merged
将包含组合数据

模板语言似乎只支持simplefor循环,因此在那里进行合并似乎是不可能的

因此,我假设数据挖掘需要在DSL中发生。但是,我需要这样做:

  • 迭代ebs_block_设备列表,跟踪索引(如Python中的
    enumerate()
    ,或Ruby中的
    each.with_index
  • 从挂载点列表中获取相应的元素
  • 将这些添加到结果映射中
具体来说,我的问题是,似乎没有任何与Python的
enumerate
函数等价的函数,这使我无法跟踪索引。如果有,我想我可以这样做:

merged=[对于索引,枚举中的x(var.ebs\u block\u设备):{
合并(x,{mount_point=>var.mount_point[index]})
}]

我在这里尝试的这种数据转换在Terraform中目前是否可行?如果不可能,首选的替代方案是什么?

事实证明,这实际上是可能的,如下所示:


变量“ebs\U块\U设备”{
description=“附加到实例的其他EBS块设备”
类型=列表(映射(字符串))
默认值=[
{
设备名称=“/dev/sdg”
体积大小=5
卷类型=“gp2”
在终止时删除\u=false
},
{
设备名称=“/dev/sdh”
体积大小=5
卷类型=“gp2”
在终止时删除\u=false
}
]
}
变量“mount_point”{
description=“要使用的装载点”
类型=列表(字符串)
默认值=[“/data”,“/home”]
}
输出“合并”{
值=[
对于索引,变量ebs\U块\U设备中的x:
合并(x,{“mount_point”=var.mount_point[index]})
]
}

感谢HashiCorp的支持。

我认为
mount\u point
需要是一个映射才能在这里使用
merge
功能。事实上,我注意到这两种类型都是
list
原语,因此可以迭代一个列表,然后通过索引访问第一个变量的元素映射和第二个变量的元素。这对您来说是可行的,但缺点是您需要创建一个保护,即两个变量的长度相等。@MattSchuchard,没有,我用Python测试过,如果Terraform有
enumerate()
,代码也可以工作,请参见要点。您的建议正是我想要做的,只是似乎没有办法在不枚举的情况下访问索引。您是否尝试将这些卷作为
用户\u数据的一部分装载?你就不能像这样做吗?可能您必须使用循环模板,如Thank you@aderubaru中所述,但问题实际上是如何合并数据。我可以找到不合并数据的方法,但我认为我想做的应该是可能的。我提出了一个功能要求。