如何通过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函数渲染脚本后传入:
- 先在auto.sh里用
${变量名}的格式占位需要替换的参数,示例:
#!/bin/bash echo "当前实例名称是 ${instance_name}" mount ${disk_device} /data
- 修改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
相关产品推荐
相关产品推荐

