Terraform: зацикливание выходной переменной с использованием модулей - PullRequest
0 голосов
/ 19 мая 2019

Я начинаю с terraform и создаю небольшой проект, всего несколько экземпляров aws, к которым подключен том ebs.

Полагаю, я начну больше работать с terraform, поэтому я хочу выполнить эту работу, определив модули, которые затем можно будет использовать в других проектах.

Для этого я создал 3 модуля (один для экземпляров, другой для создания томов ebs и последний для подключения томов).

В другом месте у меня есть "main.tf", в котором я называю эти модули. У меня проблема в том, что для создания и присоединения томов мне нужны некоторые данные, такие как instanceID.

Чтобы получить InstanceID, я определил выходную переменную в модуле «instance» (который должен быть списком, если число экземпляров больше одного):

output "instance_id" {
  value = ["${aws_instance.instance.*.id}"]
}

Затем в моем файле main.tf я вызываю переменную в модуле:

module "aws-instance" {
  source = "../../Terraform/aws-instance"
  instance_type = "t2.micro"
  instance_count = "2"
}

(some other code...)

module "aws-volume-attachment" {
  source = "../../Terraform/aws-volume-attachment"
  device_name = "/dev/sdf"
  instance_id = "${element("${module.aws-instance.instance_id}", count.index)}"
  volume_id = "${element("${module.aws-ebs-volume.volume_id}", count.index)}"
}

Но я получаю ошибку:

Error: module "aws-volume-attachment": count variables are only valid within resources

У меня вопрос, как я могу зациклить переменную, чтобы я мог присоединить каждый том к одному экземпляру?

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Подсчет не поддерживается в модулях, только в ресурсах.В вашем случае вы бы хотели передать значение instance_count в модули экземпляра, тома и вложения.Затем вы должны использовать instance_count для значения count внутри модулей (на уровне ресурсов).

Если используется count, ваш aws-instance module выведет «список» из instance_ids.То же самое относится и к томам.

Передайте эти списки в модуль aws-volume-attachment (переменные instance_id и volume_id должны иметь тип list), затем выполните итерации по ним, используя count.index.

Извините, имя ресурса, я не знаком с провайдером AWS, так как работаю с Azure, но, надеюсь, это показывает принципал .:

resource "aws-volume-attachment" {
  count = "${var.instance_count}"
  ...

  volume_id = "${var.volume_ids[count.index]}"
  instance_id = "${var.instance_ids[count.index])"
}
0 голосов
/ 19 мая 2019

«Количество» не поддерживается при объявлении модулей Terraform. У вас есть 2 варианта:

  1. Объявите модуль для каждого экземпляра и для каждого тома ebs. И передать переменные в модуль без части "count.index".

  2. Поместите EC2 и ESB в один и тот же модуль, поскольку они не могут работать друг без друга. Это хорошая практика для структурирования проектов terraform - создавать модули для целых стеков приложений. Потому что, когда у вас слишком много маленьких модулей - это становится немного грязно.

...