Объедините две карты, чтобы создать третью карту в Terraform 0.12 - PullRequest
2 голосов
/ 27 июня 2019

У меня есть требование выполнить сложное объединение входных данных в 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 в Ruby)
  • получить соответствующий элемент из списка mount_points
  • добавить их в результирующую карту.

Моя проблема, в частности, заключается в том, что, похоже, нет эквивалента функции enumerate в Python, и это мешает мне отслеживать индекс. Если бы это было так, я думаю, я мог бы сделать что-то вроде этого:

merged = [for index, x in enumerate(var.ebs_block_device): {
  merge(x, {mount_point => var.mount_point[index]})
}]

Возможно ли такое преобразование данных, которое я сейчас пытаюсь сделать здесь, в Terraform? И если это невозможно, какова предпочтительная альтернативная реализация?

1 Ответ

0 голосов
/ 30 июня 2019

Оказывается, это на самом деле возможно так:


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.

...