如何使用Terraform向GCP实例发送cloud-init脚本
使用Terraform向GCP实例下发cloud-init脚本实操指南
前置依赖配置
首先确保你的Terraform声明了对应版本的GCP和cloudinit provider,参考配置如下:
terraform { required_providers { google = { source = "hashicorp/google" version = "~> 5.0" } cloudinit = { source = "hashicorp/cloudinit" version = "~> 2.3" } } } # GCP provider基础配置,根据实际业务调整项目ID、区域等参数 provider "google" { project = "你的GCP项目ID" region = "us-central1" zone = "us-central1-a" }
cloudinit_config数据源核心参数说明(官方文档中文翻译)
gzip:布尔类型,设置是否对最终生成的cloud-init配置进行gzip压缩,GCP实例默认支持读取压缩后的配置,开启后可减少传输体积、规避metadata大小限制,建议设为truebase64_encode:布尔类型,设置是否对最终结果进行base64编码,GCP实例元数据的user-data字段要求传入base64编码后的内容,此处必须设为truepart块:每个块对应cloud-init的一个配置段,支持同时声明多个段,cloud-init会按顺序执行、同类型配置自动合并content:填写cloud-init脚本的原始内容,支持yaml格式的cloud-config、shell脚本等多种类型content_type:指定当前段的内容类型,常用值包括text/cloud-config(对应cloud-config格式配置)、text/x-shellscript(对应普通shell脚本)
完整配置示例
1. 定义cloudinit_config数据源
你可以直接在配置内写脚本内容,也可以通过file()函数读取本地的cloud-init文件:
data "cloudinit_config" "instance_cloudinit" { gzip = true base64_encode = true # 第一段:cloud-config格式配置,安装依赖、配置用户 part { content_type = "text/cloud-config" content = <<EOF #cloud-config packages: - nginx - git - curl runcmd: - systemctl enable --now nginx - echo "Cloud-init initialized successfully" > /var/www/html/index.html users: - name: dev sudo: ALL=(ALL) NOPASSWD:ALL groups: users, sudo shell: /bin/bash ssh_authorized_keys: - "ssh-rsa 你的公钥内容 dev@local" EOF } # 第二段:额外的shell初始化脚本,可根据需求追加多个part块 part { content_type = "text/x-shellscript" content = <<EOF #!/bin/bash echo "Init completed at: $(date)" > /tmp/cloudinit_finish_time EOF } }
2. 关联配置到GCP实例
在google_compute_instance资源的metadata字段传入渲染后的cloud-init内容即可:
resource "google_compute_instance" "web_server" { name = "web-server-01" machine_type = "e2-medium" boot_disk { initialize_params { image = "debian-cloud/debian-12" } } network_interface { network = "default" access_config { # 保留该空块即可分配公网IP,无需额外配置 } } metadata = { user-data = data.cloudinit_config.instance_cloudinit.rendered } }
配置验证方法
执行terraform apply完成资源创建后,登录实例可通过以下方式验证配置生效:
- 查看cloud-init执行日志:
cat /var/log/cloud-init-output.log - 访问实例公网IP,确认Nginx服务正常返回自定义页面
- 检查
/tmp/cloudinit_finish_time文件是否存在,dev用户是否创建成功
常见注意事项
- cloud-config格式的内容首行必须为
#cloud-config,shell脚本首行必须为#!/bin/bash,否则cloud-init会识别失败 - 若你的cloud-init内容过长,必须开启
gzip = true,否则会触发GCP metadata的大小上限报错 - 多个part块的执行顺序和你在配置中声明的顺序完全一致,存在依赖的逻辑需要注意先后顺序
内容的提问来源于stack exchange,提问作者Sparkler
相关产品推荐
相关产品推荐

