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}