在Terraform 0.12中组合两个地图以创建第三个地图
我需要在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
变量“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中的
,或Ruby中的enumerate()
)each.with_index
- 从挂载点列表中获取相应的元素
- 将这些添加到结果映射中李>
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中所述,但问题实际上是如何合并数据。我可以找到不合并数据的方法,但我认为我想做的应该是可能的。我提出了一个功能要求。