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

Jenkins容器中Ansible流水线SSH连接失败问题排查与解决

Jenkins流水线执行Ansible Playbook失败问题排查与解决

问题背景

在同一个Docker镜像中运行集成了Ansible的Jenkins容器,通过Ansible更新同一Docker网络内的另一个容器,采用SSH密钥文件认证方式,已测试root和jenkins两个用户。

异常现象

  • 在Jenkins/Ansible容器的CLI中,可正常SSH到目标容器,且能成功运行playbook
  • 通过Jenkins流水线执行playbook时失败;复制Jenkins控制台输出的命令,仅将临时SSH密钥替换为真实密钥后,playbook即可正常运行:
    • 临时密钥:--private-key /var/lib/jenkins/workspace/TestJs/ssh9809173197875714932.key
    • 真实密钥:--private-key /var/lib/jenkins/.ssh/jenkins_key
  • 在Jenkins Docker CLI执行以下命令完全正常:
    /usr/bin/ansible-playbook /var/lib/jenkins/workspace/TestJs/deploy/playbooks/deployToTarget.yml -i /var/lib/jenkins/workspace/TestJs/deploy/playbooks/inventory.inv --private-key /var/lib/jenkins/.ssh/jenkins_key -u jenkins
    
  • 为排除Jenkins临时密钥问题,编写了直接连接主机执行shell脚本的简单流水线,运行正常

流水线片段

stages {
    stage('Deploy on Test') {
        steps {
            ansiblePlaybook( credentialsId: 'TEST_HOST_SSH_KEY',
                     disableHostKeyChecking: true,
                     installation: 'Ansible',
                     inventory: "${WORKSPACE}/deploy/playbooks/inventory.inv",
                     playbook: "${WORKSPACE}/deploy/playbooks/deployToBSI_SMA.yml",
                     colorized: true)
        } 
    }
}

控制台错误信息

PLAY [Deploy On Test] ***************************************************

TASK [Gathering Facts] *********************************************************
[1;31mfatal: [bsi_sma]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: muxserver_listen: link mux listener /var/lib/jenkins/.ansible/cp/119f480311.4lIaQB6LhOC2svmf => /var/lib/jenkins/.ansible/cp/119f480311: Bad file descriptor", "unreachable": true}[0m

PLAY RECAP *********************************************************************
[0;31mbsi_sma[0m                    : ok=0    changed=0    [1;31munreachable=1   [0m failed=0    skipped=0    rescued=0    ignored=0 

排查过程

最初在CLI测试了-u jenkins和-u root两个用户:

  • 以root身份执行时一切正常
  • 切换为jenkins用户执行相同命令时,出现和流水线完全一致的错误

确认问题根源:Jenkins是以jenkins用户运行的,用户权限或配置加载差异导致异常。

解决方法

Jenkins流水线不会自动加载playbook目录下的Ansible配置文件,而CLI环境会自动加载。在流水线中添加环境变量指定Ansible配置文件路径后,问题解决:

environment {
    ANSIBLE_CONFIG = "${WORKSPACE}/deploy/playbooks/ansible.cfg"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:22:35