Как передать несколько файлов шаблонов в переменную user_Data в terraform - PullRequest
2 голосов
/ 28 мая 2020

назначить несколько файлов шаблонов переменной 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}"

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

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

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

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

Потому что cloud-init является очень распространенным выбором программного обеспечения для интерпретации «пользовательских данных», Terraform имеет cloudinit провайдера , который включает источник данных для создания архива 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, чтобы увидеть, как она интерпретировала конфигурацию и что произошло, когда она попыталась предпринять эти действия.

0 голосов
/ 28 мая 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 находился в родительской папке и содержал все, что было необходимо для всех дочерних модулей, затем каждый модуль добавил свои собственные спецификации c требований.

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

...