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

如何通过Terraform在GCP虚拟机创建后自动运行本地auto.sh脚本

实现本地auto.sh脚本自动运行修改方案

核心逻辑

GCP 实例的 metadata_startup_script 字段定义的内容会在实例首次初始化完成后,自动以root权限执行,你只需要将本地的auto.sh脚本内容传入该字段即可完成需求。

具体修改步骤

方案1:脚本无动态参数,直接读取本地文件

如果你的auto.sh不需要传入Terraform中定义的动态参数,直接用file函数读取本地脚本内容替换原有的metadata_startup_script取值即可。如果auto.sh和Terraform主配置文件在同一目录,修改后的google_compute_instance资源配置如下:

resource "google_compute_instance" "default" {
  name         = "test"
  machine_type = "custom-8-16384"
  zone         = "us-central1-a"

  tags = ["foo", "bar"]

  boot_disk {
    initialize_params {
      image = "centos-cloud/centos-7"
    }
  }

  network_interface {
    network = "default"

    access_config {
      
    }
  }
  # 替换原有内容,读取同目录下的auto.sh作为启动脚本
  metadata_startup_script = file("${path.module}/auto.sh")

  lifecycle {
    ignore_changes = [attached_disk]
  }
}

方案2:脚本需要传入动态参数

如果你的auto.sh需要用到Terraform中定义的变量(比如实例名称、挂载磁盘的设备名等),可以用templatefile函数渲染脚本后传入:

  1. 先在auto.sh里用${变量名}的格式占位需要替换的参数,示例:
#!/bin/bash
echo "当前实例名称是 ${instance_name}"
mount ${disk_device} /data
  1. 修改Terraform配置中的对应字段:
metadata_startup_script = templatefile("${path.module}/auto.sh", {
  instance_name = self.name
  disk_device = "/dev/sdb"
})

注意事项

  • 请确保auto.sh开头指定了正确的脚本解释器,比如第一行加#!/bin/bash
  • 如果你的脚本需要用到额外挂载的test-disk,请在auto.sh里先完成磁盘挂载操作,将挂载命令写入脚本,避免脚本访问磁盘时挂载未完成
  • 脚本执行日志可以在实例内的/var/log/messages文件中搜索startup-script关键词排查问题

内容的提问来源于stack exchange,提问作者user15224751

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 17:06:04