使用Terraform Remote-Exec时无法安装并运行脚本
解决Terraform remote-exec报错Error starting script: EOF的方案
1. 加固SSH连接配置,延长超时与保活
- 给
remote-exec的connection块设置更长的超时时间,避免脚本执行超时断开:connection { type = "ssh" user = "ubuntu" private_key = file("~/.ssh/id_rsa") timeout = "10m" # 按需调整,比如设为10分钟 agent = false } - 补充SSH保活参数,防止中间无数据传输导致连接被切断:
connection { # 其他配置不变 ssh_extra_args = ["-o", "ServerAliveInterval=30", "-o", "ServerAliveCountMax=10"] }
2. 拆分长脚本为多个独立步骤
把原本的单步安装+启动流程拆成多个null_resource,每个资源只完成一件事,依赖前一步完成后再执行:
# 先更新系统并安装依赖 resource "null_resource" "install_deps" { connection { /* 填入你的SSH连接配置 */ } provisioner "remote-exec" { inline = ["sudo apt update && sudo apt install -y curl"] } } # 安装Tailscale resource "null_resource" "install_tailscale" { depends_on = [null_resource.install_deps] connection { /* 填入你的SSH连接配置 */ } provisioner "remote-exec" { inline = ["curl -fsSL https://tailscale.com/install.sh | sh"] } } # 执行Tailscale join命令 resource "null_resource" "join_tailscale" { depends_on = [null_resource.install_tailscale] connection { /* 填入你的SSH连接配置 */ } provisioner "remote-exec" { inline = ["sudo tailscale up --authkey=${var.tailscale_auth_key}"] } }
3. 先上传脚本再执行,避免远程传递异常
不要直接把长脚本嵌入remote-exec,先在本地写好脚本,用file provisioner传到实例后再运行:
- 本地创建
install_tailscale.sh,写入完整的安装命令 - 在Terraform中配置:
resource "null_resource" "deploy_tailscale" { connection { /* 填入你的SSH连接配置 */ } # 上传本地脚本到实例 provisioner "file" { source = "./install_tailscale.sh" destination = "/tmp/install_tailscale.sh" } # 赋予执行权限并运行脚本 provisioner "remote-exec" { inline = [ "chmod +x /tmp/install_tailscale.sh", "sudo /tmp/install_tailscale.sh" ] } }
4. 等待实例完全初始化再执行脚本
实例刚启动时系统服务可能未就绪,SSH连接不稳定,添加等待机制:
resource "time_sleep" "wait_for_instance" { depends_on = [aws_instance.your_instance] # 替换为你的实例资源名称 create_duration = "2m" # 根据实例启动速度调整,比如等待2分钟 } resource "null_resource" "install_tailscale_and_join" { depends_on = [time_sleep.wait_for_instance] # 你的SSH连接与remote-exec配置 }
5. 开启SSH日志排查根因
如果以上方法无效,开启SSH verbose日志查看具体交互过程:
connection { # 其他配置不变 ssh_extra_args = ["-v"] }
运行Terraform时会输出详细的SSH交互日志,可定位是连接中断还是脚本执行环节的问题。
内容的提问来源于stack exchange,提问作者aronchick
相关产品推荐
相关产品推荐

