Объедините две карты, чтобы создать третью карту в 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, отслеживая индекс (например,
enumerate()
в Python, или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? И если это невозможно, какова предпочтительная альтернативная реализация?
1 ответ
Оказывается, это на самом деле возможно так:
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.