Jenkins Job无法在远程主机运行Ansible Playbook连接卡住
根因说明
任务无限挂起的核心原因是SSH握手阶段触发了交互式提示,Jenkins构建环境是非交互式TTY,进程会一直等待用户输入不会主动退出。此前的「Host key verification error」没有被彻底解决:仅添加SSH私钥凭据后,没有处理目标主机公钥信任逻辑,SSH遇到未授信的主机公钥时会默认停在「是否信任该主机公钥(yes/no)」的提示位,直接导致进程挂死。同密钥在本地能正常连接,是因为本地交互环境下你之前已经手动确认过主机公钥,或者本地SSH配置默认跳过了校验。
修复方案
按落地难度从低到高排序,可根据环境选择:
- 临时快速修复(适合测试环境):关闭SSH主机密钥严格校验
执行ansible-playbook命令时追加SSH参数,直接跳过主机公钥校验、不写入known_hosts文件,从根源避免交互提示:
如果使用Jenkins Ansible插件执行任务,直接在插件配置的「SSH公共参数」栏填入上述两个ansible-playbook -i <你的inventory文件路径> <目标playbook文件>.yml \ --ssh-common-args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'-o开头的参数即可。 - 生产环境合规修复:预注入可信主机公钥
- 在可正常连接目标主机的环境下,执行
ssh-keyscan <目标主机IP/域名>获取所有被管节点的SSH公钥 - 选择以下任意一种方式将公钥注入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用户) - 先执行连通性测试命令,验证密钥可用:
该步骤正常返回输出后再执行playbook即可ssh -i <容器内私钥路径> -o StrictHostKeyChecking=no <远程用户名>@<目标节点IP> echo "SSH connect success"
- 确认容器内的SSH私钥文件权限为
- 关闭无效的密码登录探测
部分Ansible版本默认会优先尝试密码登录,再尝试密钥登录,如果目标节点SSH服务未关闭密码认证,进程可能卡在密码输入提示位。可在执行playbook时追加参数--ask-pass=false,或者在项目根目录的ansible.cfg中添加如下配置,强制仅使用密钥登录:[defaults] ask_pass = False private_key_file = <容器内私钥文件路径>
排查技巧
如果以上方案操作后仍然挂起,可在执行ansible-playbook时追加-vvvv参数开启最高级别debug日志,日志会完整打印SSH握手全流程,可直接定位到具体卡在哪一步,无需盲猜。
内容的提问来源于stack exchange,提问作者MichealMills
相关产品推荐
相关产品推荐

