问题现象描述
使用docker安装Jenkins,安装成功后,在添加Publish over SSH插件过后,添加server免密登录时,报了这个异常:jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [dev-85]. Message [Auth fail]]
已做的工作
- Jenkins在宿主机里已挂载目录,服务可正常运行
- Jenkins宿主机可以免密登上目标机器(如上图的dev-85机器),关于如何实现ssh免密登录,可自行百度
尝试解决
按理,在ssh配置OK的情况下,不会出现连接不上的情况,遂百度及Google之,找到的无非是这样的
点了好几个链接,进去后发现解决方案都很雷同,也就是说,免密登录的配置没配置好,什么Jenkins所在机器的公钥没有配置在目标机器的.ssh/authorized_keys中。很明显,我是已经配置好了,也已经可以免密ssh登录到目标机器
于是猜想到问题会不会是出在docker上,我在docker上运行Jenkins镜像时,配置了挂载目录: /data/jenkins_home:/var/jenkins_home(左边为宿主机目录,右边为docker容器目录),会不会是目录挂载问题呢?
最终解决
为了验证上述的猜想,于是我在宿主机的/data/jenkins_hom目录下,重新执行ssh-keygen -trsa -C ""
生成一对公私钥,然后将/data/jenkins_hom/.ssh/id_rsa.pub 拷贝至目标server的.ssh/authorized_keys中,执行结束并保存后,再重新回来Jenkins页面连接时,发现成功脸上
反思
其实核心还是配ssh免密登录的问题,只不过刚开始时没有配对位置。假如使用源代码安装的话,可能不会存在这个情况,但在使用docker安装时,由于容器运行时,挂载的目录下没有.ssh/*相关的公私钥,自然与目标机器无法连接上(此时目标机器添加的公钥是无法在Jenkins容器运行的目录下找到),所以也就报了相应的异常。所以正确的解法就是,在Jenkins容器运行的目录下,新生成公私钥,然后将生成的公钥copy至目标机器的.ssh/authorized_keys即可