GitLab CI部署Ansible Playbook时SSH认证失败请求排查
问题排查:Ansible通过GitLab Runner连接远程节点失败(Load key error in libcrypto)
已完成前置配置:
- 远程部署节点已添加对应公钥
- GitLab项目中配置了SSH私钥变量
- GitLab Runner已完成注册与设置
执行Ansible Playbook时出现连接失败,inventory.ini内容为:
ansible@masked_ip_address
错误日志如下:
<ansible@[MASKED]> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile="/home/gitlab-runner/builds/ZSxgtfmp/0/riyaz/ansible.tmp/SSH_PRIVATE_KEY"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="ansible"' -o ConnectTimeout=10 -o 'ControlPath="/home/gitlab-runner/.ansible/cp/f7c4351094"' ansible@[MASKED] '/bin/sh -c '"'"'echo ~ansible && sleep 0'"'"'' <ansible@[MASKED]> (255, b'', b'Load key "/home/gitlab-runner/builds/ZSxgtfmp/0/riyaz/ansible.tmp/SSH_PRIVATE_KEY": error in libcrypto\r\nansible@[MASKED]: Permission denied (publickey,password).\r\n') fatal: [ansible@[MASKED]]: UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Load key \"/home/gitlab-runner/builds/ZSxgtfmp/0/riyaz/ansible.tmp/SSH_PRIVATE_KEY\": error in libcrypto\r\nansible@[MASKED]: Permission denied (publickey,password).", "unreachable": true } PLAY RECAP ********************************************************************* ansible@[MASKED] : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0 Cleaning up project directory and file based variables 00:00 ERROR: Job failed: exit status 1
可能原因及解决方案
1. SSH私钥格式或内容损坏
- 验证GitLab中SSH私钥变量的完整性:确认私钥包含完整的首尾标识(如
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----),无多余换行、空格或特殊字符。 - 本地测试私钥有效性:使用该私钥直接连接远程节点,命令如下:
若连接失败,说明私钥本身存在问题,重新生成或导出正确的私钥。ssh -i /path/to/local/private_key ansible@masked_ip_address
2. 临时私钥文件权限违规
Ansible会将GitLab变量中的私钥写入临时文件,SSH要求私钥文件权限必须为600(仅所有者可读可写),否则会拒绝加载:
- 在GitLab CI配置的
before_script中手动处理私钥权限:before_script: - mkdir -p ~/.ssh - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan masked_ip_address >> ~/.ssh/known_hosts - 避免依赖Ansible自动生成的临时密钥文件,手动指定私钥路径更可靠。
3. 私钥类型与环境不兼容
- 若使用ED25519类型密钥,检查远程节点的SSH服务是否支持(旧版本OpenSSH可能默认禁用),可切换为RSA密钥测试兼容性。
- 检查GitLab Runner服务器的libcrypto版本:若私钥使用了较新的加密算法(如AES-256-GCM),旧版libcrypto无法解析,需升级libcrypto或重新生成兼容的私钥。
4. Inventory配置不规范
- 优化
inventory.ini配置,明确指定连接参数,避免模糊格式:[target_nodes] masked_ip_address ansible_user=ansible ansible_ssh_private_key_file=~/.ssh/id_rsa - 不建议在inventory中直接使用
user@ip格式,可能导致Ansible解析连接参数时出现异常。
5. GitLab Runner环境权限问题
- 检查
gitlab-runner用户的~/.ssh目录权限:确保目录权限为700,目录内文件权限为600,命令如下:sudo chmod 700 /home/gitlab-runner/.ssh sudo chmod 600 /home/gitlab-runner/.ssh/* - 清理Runner缓存,避免旧临时文件干扰:
sudo gitlab-runner cache clear
内容的提问来源于stack exchange,提问作者Riyaz Azam
相关产品推荐
相关产品推荐

