GitLab CI/CD通过SSH连接远程服务器遇Operation timed out错误
解决GitLab CI执行SSH命令超时问题
排查方向及解决方案
1. 网络连通性验证
本地能正常SSH不代表GitLab Runner所在服务器能连通目标主机,先确认Runner的网络权限:
- 在Runner服务器(或临时在CI脚本里添加测试命令)执行:
ping $SERVER_IP telnet $SERVER_IP $SERVER_PORT - 如果测试失败,说明二者之间存在防火墙/安全组拦截:
- 检查目标服务器的安全组规则,开放GitLab Runner服务器IP对
$SERVER_PORT的访问权限; - 确认Runner所在网络的出口策略没有封禁目标服务器的IP和端口。
- 检查目标服务器的安全组规则,开放GitLab Runner服务器IP对
2. CI环境密钥配置检查
- 验证
ID_RSA变量是否完整传递:在before_script中临时添加打印(测试后删除,避免密钥泄露):cat "${ID_RSA}" - 确认密钥已成功添加到ssh-agent:在
before_script中添加:ssh-add -l - 脚本中
script阶段无需再次指定-i $ID_RSA,因为before_script已经通过ssh-add加载了密钥,重复指定可能引发权限问题。
3. CI变量正确性校验
- 先打印变量值确认配置无误,在
script开头添加:echo "目标服务器信息:$SERVER_USER@$SERVER_IP:$SERVER_PORT" - 检查
SERVER_PORT是否为数字格式,SERVER_IP是否为正确的公网/内网IP,避免拼写错误。
4. 主机密钥校验冲突处理
你在before_script中已配置SSH_KNOWN_HOSTS,但script的SSH命令又加了-o StrictHostKeyChecking=no,二者无需混用:
- 若使用
SSH_KNOWN_HOSTS,确保变量内容是目标主机的正确公钥指纹,可删除SSH命令中的-o StrictHostKeyChecking=no; - 若仅用于测试,可保留
-o StrictHostKeyChecking=no,并删除before_script中关于SSH_KNOWN_HOSTS的配置。
优化后的.gitlab-ci.yml示例
deploy: image: alpine:latest stage: deploy tags: - deployment before_script: - 'command -v ssh-agent >/dev/null || ( apk add --update openssh )' - eval $(ssh-agent -s) - cat "${ID_RSA}" | tr -d '\r' | ssh-add - > /dev/null 2>&1 - ssh-add -l # 验证密钥加载状态 - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts - apk update && apk add openssh-client script: - echo "目标服务器信息:$SERVER_USER@$SERVER_IP:$SERVER_PORT" - ssh -p $SERVER_PORT $SERVER_USER@$SERVER_IP "echo $SERVER_IP"
内容的提问来源于stack exchange,提问作者David Hall
相关产品推荐
相关产品推荐

