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

Jenkins Job无法在远程主机运行Ansible Playbook连接卡住

根因说明

任务无限挂起的核心原因是SSH握手阶段触发了交互式提示,Jenkins构建环境是非交互式TTY,进程会一直等待用户输入不会主动退出。此前的「Host key verification error」没有被彻底解决:仅添加SSH私钥凭据后,没有处理目标主机公钥信任逻辑,SSH遇到未授信的主机公钥时会默认停在「是否信任该主机公钥(yes/no)」的提示位,直接导致进程挂死。同密钥在本地能正常连接,是因为本地交互环境下你之前已经手动确认过主机公钥,或者本地SSH配置默认跳过了校验。

修复方案

按落地难度从低到高排序,可根据环境选择:

  • 临时快速修复(适合测试环境):关闭SSH主机密钥严格校验
    执行ansible-playbook命令时追加SSH参数,直接跳过主机公钥校验、不写入known_hosts文件,从根源避免交互提示:
    ansible-playbook -i <你的inventory文件路径> <目标playbook文件>.yml \
      --ssh-common-args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
    
    如果使用Jenkins Ansible插件执行任务,直接在插件配置的「SSH公共参数」栏填入上述两个-o开头的参数即可。
  • 生产环境合规修复:预注入可信主机公钥
    1. 在可正常连接目标主机的环境下,执行ssh-keyscan <目标主机IP/域名>获取所有被管节点的SSH公钥
    2. 选择以下任意一种方式将公钥注入Jenkins Docker Agent环境:
    • 构建步骤临时注入:在执行playbook之前新增Shell步骤,创建.ssh目录并写入公钥,同时修正权限:
      mkdir -p ~/.ssh
      chmod 700 ~/.ssh
      ssh-keyscan <目标节点1IP> <目标节点2IP> >> ~/.ssh/known_hosts
      chmod 600 ~/.ssh/known_hosts
      
    • 镜像固化:构建Jenkins Agent Docker镜像时,提前把预生成的known_hosts文件放到镜像内jenkins用户的~/.ssh/目录下,固定好目录和文件权限,无需每次构建重复生成
  • 排查密钥权限异常
    SSH对私钥权限要求极严格,如果容器内挂载的私钥权限大于600,SSH会默认认为密钥不安全拒绝使用,部分OpenSSH版本在非交互环境下不会抛出明确错误,会直接挂起。执行playbook前先做两步校验:
    • 确认容器内的SSH私钥文件权限为600,所在.ssh目录权限为700,所属用户为容器内运行Jenkins进程的用户(默认通常是uid为1000的jenkins用户)
    • 先执行连通性测试命令,验证密钥可用:
      ssh -i <容器内私钥路径> -o StrictHostKeyChecking=no <远程用户名>@<目标节点IP> echo "SSH connect success"
      
      该步骤正常返回输出后再执行playbook即可
  • 关闭无效的密码登录探测
    部分Ansible版本默认会优先尝试密码登录,再尝试密钥登录,如果目标节点SSH服务未关闭密码认证,进程可能卡在密码输入提示位。可在执行playbook时追加参数--ask-pass=false,或者在项目根目录的ansible.cfg中添加如下配置,强制仅使用密钥登录:
    [defaults]
    ask_pass = False
    private_key_file = <容器内私钥文件路径>
    
排查技巧

如果以上方案操作后仍然挂起,可在执行ansible-playbook时追加-vvvv参数开启最高级别debug日志,日志会完整打印SSH握手全流程,可直接定位到具体卡在哪一步,无需盲猜。

内容的提问来源于stack exchange,提问作者MichealMills

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:01:43