You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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大小限制,建议设为true
  • base64_encode:布尔类型,设置是否对最终结果进行base64编码,GCP实例元数据的user-data字段要求传入base64编码后的内容,此处必须设为true
  • part块:每个块对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:06:03