Terraform: проблема рендеринга файла YAML в разделе хранилища конфигурации linux контейнера плоской ОС

Я пытаюсь создать файл с помощью рендеринга шаблона для передачи пользовательским данным экземпляра ec2. Я использую стороннего поставщика терраформ для создания файла зажигания из YAML.

data "ct_config" "worker" {
  content      = data.template_file.file.rendered
  strict       = true
  pretty_print = true
}
data "template_file" "file" {
  ...
  ...
  template = file("${path.module}/example.yml")
  vars = {
    script = file("${path.module}/script.sh")
  }
}

example.yml

storage:
  files:
    - path: "/opt/bin/script"
      mode: 0755
      contents: 
        inline: |
          ${script}

Ошибка:

Error: Error unmarshaling yaml: yaml: line 187: could not find expected ':'

  on ../../modules/launch_template/launch_template.tf line 22, in data "ct_config" "worker":
  22: data "ct_config" "worker" {

Если я изменю ${script}для выборки данных, тогда он работает. Кроме того, независимо от того, что я вставил в script.sh, я получаю ту же ошибку.

2 ответа

Решение

Вам нужен такой результат (псевдокод):

storage:
  files:
    - path: "/opt/bin/script"
      mode: 0755
      contents: 
        inline: |
          {{content of script file}}

В вашей текущей реализации все строки после первой, загруженной из script.sh, не будут иметь отступов и не будут интерпретироваться должным образом (все содержимое script.sh) декодером YAML.

Используя indent, вы можете исправить отступ, а используя новую функцию файла шаблона, вы можете использовать немного более чистую настройку для шаблона:

data "ct_config" "worker" {
  content      = local.ct_config_content
  strict       = true
  pretty_print = true
}

locals {
  ct_config_content = templatefile("${path.module}/example.yml", {
    script = indent(10, file("${path.module}/script.sh"))
  })
}

У меня была именно эта проблема с ct_config, а сегодня разобрался. Тебе следует base64encodeваш скрипт, чтобы убедиться, что он написан правильно без новых строк - без этого новые строки в вашем скрипте попадут в CT, который попытается создать файл Ignition, который не может иметь новых строк, вызывая ошибку, с которой вы столкнулись изначально.

После кодирования вам просто нужно сказать CT, чтобы !!binaryфайл, чтобы Ignition правильно декодировал base64 при развертывании:

      data "template_file" "file" {
  ...
  ...
  template = file("${path.module}/example.yml")
  vars = {
    script = base64encode(file("${path.module}/script.sh"))
  }
}
      storage:
  files:
    - path: "/opt/bin/script"
      mode: 0755
      contents: 
        inline: !!binary |
          ${script}
Другие вопросы по тегам