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

使用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传到实例后再运行:

  1. 本地创建install_tailscale.sh,写入完整的安装命令
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:37:10