如何配置CICD实现SSH连接?GitLab Runner流水线SSH失败排查
老哥,我看你遇到的问题是GitLab CI/CD流水线里SSH连不上目标机器,但直接在Runner机器上手动连接就没问题对吧?这情况我碰到好多次了,核心原因就是CI运行的环境和你手动操作的环境完全不一样——CI是用Runner的专属执行用户(一般是gitlab-runner)来跑任务的,而你手动SSH用的是自己的登录用户,这俩环境的SSH配置、权限都不互通。给你几个靠谱的排查和解决思路:
解决GitLab CI/CD SSH连接失败的核心方案
1. 同步SSH密钥到Runner执行用户的环境
你手动能用的SSH密钥,大概率存在你个人用户的~/.ssh/目录下,但CI用的是gitlab-runner用户的环境,所以得把密钥同步过去,还要设置正确的权限(SSH对密钥权限要求很严,权限太宽会直接拒绝):
# 在Runner机器上执行这些命令 sudo cp ~/.ssh/id_rsa /home/gitlab-runner/.ssh/ sudo chown gitlab-runner:gitlab-runner /home/gitlab-runner/.ssh/id_rsa sudo chmod 600 /home/gitlab-runner/.ssh/id_rsa
另外,别忘了把目标服务器的主机公钥加到gitlab-runner用户的known_hosts里,不然CI会因为首次连接的主机验证弹窗(CI环境是无交互的,弹窗直接导致失败):
sudo -u gitlab-runner ssh-keyscan 你的目标服务器IP/域名 >> /home/gitlab-runner/.ssh/known_hosts
2. 用GitLab CI变量管理SSH密钥(更灵活)
如果不想动Runner机器的本地文件,推荐用GitLab的CI/CD变量来存储私钥,这样更安全也更易维护:
- 打开项目的「Settings → CI/CD → Variables」,添加一个新变量,比如命名为
SSH_PRIVATE_KEY,把你的SSH私钥内容(注意是私钥,不是公钥)粘贴进去,勾选「Protect variable」和「Mask variable」防止泄露 - 然后在
.gitlab-ci.yml里添加初始化SSH的步骤:
stages: - test_ssh test_ssh_job: stage: test_ssh script: # 初始化SSH目录和权限 - mkdir -p ~/.ssh - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa # 添加目标服务器到已知主机 - ssh-keyscan 你的目标服务器IP/域名 >> ~/.ssh/known_hosts # 测试SSH连接 - ssh 目标服务器用户名@你的目标服务器IP/域名 "echo 'SSH连接成功!'"
3. 临时测试:关闭主机密钥验证(仅测试用)
如果只是想快速验证是不是主机验证的问题,可以在SSH命令里加参数跳过验证,但这个方法不推荐在生产环境用,毕竟不安全:
ssh -o StrictHostKeyChecking=no 目标服务器用户名@你的目标服务器IP/域名 "echo 测试连接"
4. 模拟CI环境排查问题
直接在Runner机器上切换到gitlab-runner用户,模拟CI的执行环境,看看手动执行SSH命令会不会失败:
sudo su - gitlab-runner ssh 目标服务器用户名@你的目标服务器IP/域名
如果这个命令也失败,那说明问题出在gitlab-runner用户本身的SSH配置上,回到第一步重新检查密钥和权限就行。
内容的提问来源于stack exchange,提问作者Mansoor
相关产品推荐
相关产品推荐

