在不使用 Terraform 文件配置器的情况下将本地文件部署到实例

Posted

技术标签:

【中文标题】在不使用 Terraform 文件配置器的情况下将本地文件部署到实例【英文标题】:Deploy local files to instances without using Terraform file provisioners 【发布时间】:2020-02-26 02:02:08 【问题描述】:

作为在 *** 上发帖的其他几位用户,我遇到了文件配置器的问题,Terraform 文档说我们不应该依赖它们。

解决文件配置器的最佳方法是什么 - 特别是对于本地配置文件和脚本?

【问题讨论】:

【参考方案1】:

一种运行良好且不需要直接连接到实例的解决方案是使用 userdata 作为挂钩从文件的 base64 版本“安装”文件。

我们实际上可以将文件作为 base64 字符串嵌入到用户数据初始化脚本中。这适用于 AWS 中的 Windows 和 Linux 实例,并且还兼容在启动时运行 userdata 脚本。

解决方案说明:

    terraform plan 期间,使用 terraform 函数 base64encode(file("path/to/file")) 将您需要的任何本地文件编码为 base64 字符串。 (可选)在用户数据执行开始时保存一个标记文件(_INIT_STARTED_);此文件将具有 userdata 执行开始时的创建时间戳。 在运行 实际 userdata 脚本之前,将 base64 字符串写入文本文件。 (实际命令在 windows 和 linux 之间有所不同,请参见下面的示例。) 运行userdata 脚​​本本身(userdata_win.batuserdata_lin.sh) (可选)最后,保存第二个标记文件 (_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

【讨论】:

感谢这个想法!如果cloud-config 可用,您可以使用write_files 和b64 编码。

以上是关于在不使用 Terraform 文件配置器的情况下将本地文件部署到实例的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 Apple Developer Portal 的情况下将 UDID 添加到配置文件

如何在不删除源文件的情况下将数据从 HDFS 加载到配置单元?

如何在不使用任何付费工具的情况下将 dbf 文件导入 mysql?

有啥方法可以在不使用文件的情况下将 MIDI 加载到 AKAppleSequencer 或 AKSequencer 中?

如何在不先加载到 RAM 的情况下将文件加载到 blob 中?

是否可以在不运行 QEMU 的情况下将文件复制到 QEMU 映像?