Развертывание локальных файлов в экземплярах без использования провайдеров файлов Terraform - PullRequest
0 голосов
/ 30 октября 2019

Как и несколько других пользователей, разместивших сообщения в StackOverflow, я столкнулся с проблемами с поставщиками файлов, и в документации Terraform говорится, что мы не должны на них полагаться.

Как лучше всего обходить провайдеров файлов - особенно для локальных файлов конфигурации и сценариев?

1 Ответ

0 голосов
/ 30 октября 2019

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

Мы можем фактически встроить файлы как строки base64 в сценарии инициализации пользовательских данных. Это работает как для экземпляров Windows, так и для Linux в AWS, и совместимо также с выполнением сценария пользовательских данных при запуске.

Решение Описание:

  1. Во время terraform plan, кодируйте любой локальный кодфайлы, которые вам нужны как строки base64 с использованием функций terraform base64encode(file("path/to/file")).
  2. (необязательно). Сохраните файл маркера (_INIT_STARTED_) в начале выполнения пользовательских данных;этот файл будет иметь метку времени создания, когда началось выполнение userdata.
  3. Перед запуском сценария userdata actual запишите строки base64 в текстовые файлы. (Фактическая команда зависит от Windows и Linux, см. Примеры ниже.)
  4. Запустите сам скрипт userdata (userdata_win.bat или userdata_lin.sh)
  5. (Необязательно) Наконец, сохранитевторой файл маркера (_INIT_COMPLETE_), который будет иметь метку времени создания после завершения сценария userdata. (Отсутствие этого файла также полезно для обнаружения ошибок сценариев и / или все еще работающих сценариев после входа в экземпляр.)

Для экземпляров AWS Linux:

data "template_file" "userdata_lin" {
  template = <<EOF
#!/bin/bash
mkdir -p /home/ubuntu/setup-scripts
cd /home/ubuntu/setup-scripts
touch _INIT_STARTED_
echo ${base64encode(file("${path.module}/userdata_lin.sh"))} | base64 --decode > userdata.sh
echo ${base64encode(file("${path.module}/config.json"))} | base64 --decode > config.json
${file("${path.module}/userdata_lin.sh")}
sudo chmod 777 *
touch _INIT_COMPLETE_
EOF
}

# ...

resource "aws_instance" "my_linux_instance" {
  # ...
  user_data = data.template_file.userdata_lin.rendered
}

Для экземпляров AWS Windows:

data "template_file" "userdata_win" {
  template = <<EOF
<script>
mkdir C:\Users\Administrator\setup-scripts
cd C:\Users\Administrator\setup-scripts
echo "" > _INIT_STARTED_
echo ${base64encode(file("${path.module}/userdata_win.bat"))} > tmp1.b64 && certutil -decode tmp1.b64 userdata.bat
echo ${base64encode(file("${path.module}/config.json"))} > tmp2.b64 && certutil -decode tmp2.b64 config.json
${file("${path.module}/userdata_win.bat")}
echo "" > _INIT_COMPLETE_
</script>
<persist>false</persist>
EOF
}

# ...

resource "aws_instance" "my_windows_instance" {
  # ...
  user_data = data.template_file.userdata_win.rendered
}
...