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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:04:58