Terraform Cloud-init Provider

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
AWS Amazon Web Services 亚马逊云服务
EC2 Elastic Compute Cloud AWS 虚拟机服务
MIME Multipurpose Internet Mail Extensions 多用途互联网邮件扩展,此处用于封装多段初始化配置
YAML YAML Ain’t Markup Language 常用于配置文件的数据序列化语言

用途#

hashicorp/cloudinit 提供 cloudinit_config data source,将 cloud-config 和 shell 脚本组合成多段 MIME user data,交给云平台创建实例时使用。Provider 无需额外认证配置;它只渲染文本,实际初始化由实例内的 cloud-init 执行。官方说明

示例#

以下示例在本地渲染初始化配置,不创建云资源,也不需要额外文件。目标 Linux 镜像需安装并启用 cloud-init。

terraform {
  required_providers {
    cloudinit = {
      source  = "hashicorp/cloudinit"
      version = "~> 2.3"
    }
  }
}

data "cloudinit_config" "bootstrap" {
  gzip          = false
  base64_encode = false

  part {
    filename     = "cloud-config.yaml"
    content_type = "text/cloud-config"
    content = "#cloud-config\n${yamlencode({
      write_files = [{
        path        = "/etc/example-app.conf"
        permissions = "0644"
        content     = "environment=dev\n"
      }]
    })}"
  }

  part {
    filename     = "bootstrap.sh"
    content_type = "text/x-shellscript"
    content      = <<-SCRIPT
      #!/bin/sh
      set -eu
      test -f /etc/example-app.conf
      printf 'Bootstrap completed\n' > /var/tmp/example-bootstrap.done
    SCRIPT
  }
}

output "user_data" {
  value = data.cloudinit_config.bootstrap.rendered
}

保存为 main.tf,执行 terraform init、terraform validate、terraform plan;审查后 terraform apply,再通过 terraform output -raw user_data 检查生成的 MIME 文本。示例使用主版本约束;提交 .terraform.lock.hcl 固定实际安装版本。

接入云实例与编码#

下面的属性放入已有的 aws_instance 配置;AWS provider、镜像、网络等参数见 Terraform AWS。

# 在已有 aws_instance 资源内添加:
user_data = data.cloudinit_config.bootstrap.rendered
cloudinit_config 配置 rendered 内容 aws_instance 接收属性
gzip = false、base64_encode = false 原始 MIME 文本,本例采用此配置 user_data
gzip = true、base64_encode = true gzip 压缩后再 Base64 编码 user_data_base64

gzip 和 base64_encode 默认都为 true;启用 gzip 时不能关闭 Base64。不要把已编码内容再传入 user_data 导致重复编码;其他云平台需按自己的 user data 接口选择编码。cloudinit_config 参数、aws_instance 参数

注意事项与排查#

  • cloud-config 内容以 #cloud-config 开头,shell 脚本以 shebang 开头;part 的 content_type 应与内容匹配。
  • MIME 各段按声明顺序输出,但 cloud-init 按模块与启动阶段执行;本例的 write_files 在普通启动脚本前写入文件,复杂依赖应按目标镜像的 cloud-init 配置验证。
  • 常见首次启动脚本不会因修改 Terraform 配置自动在既有实例上重跑。aws_instance 的 user_data_replace_on_change = true 可在 user data 变化时替换实例;启用前审查停机及数据保留影响。
  • user data 内容可能进入 Terraform state、实例元数据和日志;Base64 不是加密。不要嵌入长期密码或私钥,使用实例身份从秘密管理服务读取。
  • Terraform apply 完成不代表初始化或应用已就绪。在目标实例检查 cloud-init 状态、日志和应用健康;脚本应能安全重复执行。Cloud-init 排查
# 在目标实例执行;返回非零时继续查看日志。
sudo cloud-init status --wait --long
sudo tail -n 100 /var/log/cloud-init.log /var/log/cloud-init-output.log
sudo cat /var/tmp/example-bootstrap.done

参考#

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭