Как передать несколько файлов шаблонов в переменную user_Data в terraform

назначить несколько файлов шаблонов переменной user_Data. мы не хотим объединять этот шаблон в один файл из-за некоторого архитектурного паттерна.

Я новичок в терраформе, так что борюсь с этим.

data "template_file" "userdata_lin1" {
  template = <<EOF
#!/bin/bash
crontab cronjobfileremote
EOF
}

data "template_file" "userdata_lin2" {
  template = <<EOF
#!/bin/bash
echo "hello"
EOF
}

 user_data  = "${data.template_file.user_data1.rendered}"

person pratik    schedule 28.05.2020    source источник


Ответы (2)


Основным ограничением большинства облачных платформ является то, что «пользовательские данные» или «настраиваемые метаданные» и т. Д. (Терминология зависит от поставщика) представляют собой одну непрозрачную строку байтов. Интерпретация этих байтов зависит от того, какое программное обеспечение вы установили в образ виртуальной машины, которое его использует.

Обычный выбор такого программного обеспечения - cloud-init. Если вы используете cloud-init, то «пользовательские данные» могут быть предоставлены в ряде различных форматы.

Основной способ предоставить cloud-init несколько отдельных разделов - использовать архив MIME-Multipart, который представляет собой объединение нескольких значений, перемежающихся с заголовками, чтобы позволить cloud-init определить границы и понять, как вы намереваетесь интерпретировать каждую часть.

Поскольку cloud-init - очень распространенный выбор программного обеспечения для интерпретации "пользовательских данных", Terraform имеет cloudinit провайдера < / a>, который включает источник данных для создания архива MIME-Multipart .

data "cloudinit_config" "example" {
  gzip          = false
  base64_encode = false

  part {
    content_type = "text/x-shellscript"
    filename = "userdata_lin1"
    content  = <<-EOF
      #!/bin/bash
      crontab cronjobfileremote
    EOT
  }

  part {
    content_type = "text/x-shellscript"
    filename = "userdata_lin2"
    content  = <<-EOF
      #!/bin/bash
      echo "hello"
    EOT
  }
}

Затем вы можете установить свой user_data аргумент для вывода из этого источника данных:

  user_data = data.cloudinit_config.example.rendered

Важно отметить, что с точки зрения Terraform и вашего поставщика облачных вычислений содержимое user_data - это просто произвольная строка. Любые проблемы при обработке строки должны быть отлажены в самой целевой операционной системе путем чтения cloud-init журналов, чтобы увидеть, как она интерпретировала конфигурацию и что произошло, когда она попыталась выполнить эти действия.

person Martin Atkins    schedule 28.05.2020

Раньше я объединял два файла шаблона в один.
Вот так:

data "template_file" "userdata" {
  template = "${format("%s%s", file("${path.module}/../common.sh"), file("${path.module}/fo.sh"))}"

  vars {
    efs_url     = "${var.efs_url}"
    hostname    = "${data.template_file.hostname.rendered}"
    api_key     = "${var.api_key}"
  }
}

Как видите, я объединяю два файла шаблона:

  • ../common.sh
  • fo.sh

В моем случае это было частью проекта с несколькими модулями terraform common.sh находился в родительской папке и содержал все, что было необходимо для всех дочерних модулей, затем каждый модуль добавлял свои собственные специфические требования.

Вы также можете видеть, что одна из переменных для интерполяции также является файлом template_file:
hostname = "${data.template_file.hostname.rendered}"
Это прекрасно и помогает при вложении шаблонов. На всякий случай если понадобится ...

person Helder Sepulveda    schedule 28.05.2020
comment
Спасибо, Хелдер, за ответ. Ответ Мартина решил мою проблему, но это новый совет, который я узнал из вашего ответа. так что спасибо за это. Не могли бы вы также помочь мне с stackoverflow.com/questions/62101009/ - person pratik; 30.05.2020
comment
@pratik Я тоже кое-что узнал, я никогда раньше этого не видел cloudinit_config - person Helder Sepulveda; 30.05.2020