在 Terraform 0.12 中合并两张地图以创建第三张地图
Combine two maps to create a third map in Terraform 0.12
我需要在 Terraform 0.12 中对输入数据进行一些复杂的合并。我不知道这是否可能,但也许我只是做错了什么。
我有两个变量:
variable "ebs_block_device" {
description = "Additional EBS block devices to attach to the instance"
type = list(map(string))
default = [
{
device_name = "/dev/sdg"
volume_size = 5
volume_type = "gp2"
delete_on_termination = false
},
{
device_name = "/dev/sdh"
volume_size = 5
volume_type = "gp2"
delete_on_termination = false
}
]
}
variable "mount_point" {
description = "Mount point to use"
type = list(string)
default = ["/data", "/home"]
}
然后我想将这些资源合并到一个模板中,如下所示:
#!/usr/bin/env bash
%{for e in merged ~}
mkfs -t xfs ${e.device_name}
mkdir -p ${e.mount_point}
mount ${e.device_name} ${e.mount_point}
%{endfor}
其中 merged
将包含组合数据。
模板语言似乎只支持简单的for循环,所以在那里进行合并似乎是不可能的。
因此,我假设数据修改需要在 DSL 中进行。但是,我需要这样做:
- 遍历 ebs_block_devices 的列表,跟踪索引(如 Python 中的
enumerate()
,或 Ruby 中的 each.with_index
)
- 从mount_points
的列表中获取对应的元素
- 将这些添加到生成的地图中。
我的问题,具体而言,似乎没有任何等效于 Python 的 enumerate
功能,这使我无法跟踪索引。如果有的话,我想我可以做这样的事情:
merged = [for index, x in enumerate(var.ebs_block_device): {
merge(x, {mount_point => var.mount_point[index]})
}]
Terraform 目前是否可以像我在这里尝试做的那样进行数据转换?如果不可能,首选的替代实施是什么?
事实证明这实际上是可能的:
variable "ebs_block_device" {
description = "Additional EBS block devices to attach to the instance"
type = list(map(string))
default = [
{
device_name = "/dev/sdg"
volume_size = 5
volume_type = "gp2"
delete_on_termination = false
},
{
device_name = "/dev/sdh"
volume_size = 5
volume_type = "gp2"
delete_on_termination = false
}
]
}
variable "mount_point" {
description = "Mount point to use"
type = list(string)
default = ["/data", "/home"]
}
output "merged" {
value = [
for index, x in var.ebs_block_device:
merge(x, {"mount_point" = var.mount_point[index]})
]
}
感谢 HashiCorp 的支持。
我需要在 Terraform 0.12 中对输入数据进行一些复杂的合并。我不知道这是否可能,但也许我只是做错了什么。
我有两个变量:
variable "ebs_block_device" {
description = "Additional EBS block devices to attach to the instance"
type = list(map(string))
default = [
{
device_name = "/dev/sdg"
volume_size = 5
volume_type = "gp2"
delete_on_termination = false
},
{
device_name = "/dev/sdh"
volume_size = 5
volume_type = "gp2"
delete_on_termination = false
}
]
}
variable "mount_point" {
description = "Mount point to use"
type = list(string)
default = ["/data", "/home"]
}
然后我想将这些资源合并到一个模板中,如下所示:
#!/usr/bin/env bash
%{for e in merged ~}
mkfs -t xfs ${e.device_name}
mkdir -p ${e.mount_point}
mount ${e.device_name} ${e.mount_point}
%{endfor}
其中 merged
将包含组合数据。
模板语言似乎只支持简单的for循环,所以在那里进行合并似乎是不可能的。
因此,我假设数据修改需要在 DSL 中进行。但是,我需要这样做:
- 遍历 ebs_block_devices 的列表,跟踪索引(如 Python 中的
enumerate()
,或 Ruby 中的each.with_index
) - 从mount_points 的列表中获取对应的元素
- 将这些添加到生成的地图中。
我的问题,具体而言,似乎没有任何等效于 Python 的 enumerate
功能,这使我无法跟踪索引。如果有的话,我想我可以做这样的事情:
merged = [for index, x in enumerate(var.ebs_block_device): {
merge(x, {mount_point => var.mount_point[index]})
}]
Terraform 目前是否可以像我在这里尝试做的那样进行数据转换?如果不可能,首选的替代实施是什么?
事实证明这实际上是可能的:
variable "ebs_block_device" {
description = "Additional EBS block devices to attach to the instance"
type = list(map(string))
default = [
{
device_name = "/dev/sdg"
volume_size = 5
volume_type = "gp2"
delete_on_termination = false
},
{
device_name = "/dev/sdh"
volume_size = 5
volume_type = "gp2"
delete_on_termination = false
}
]
}
variable "mount_point" {
description = "Mount point to use"
type = list(string)
default = ["/data", "/home"]
}
output "merged" {
value = [
for index, x in var.ebs_block_device:
merge(x, {"mount_point" = var.mount_point[index]})
]
}
感谢 HashiCorp 的支持。