Jenkins执行远程Puppet Agent安装脚本时出现Host key verification failed错误
Jenkins执行Puppet Agent安装脚本报错Host key verification failed的解决办法
这个问题的核心原因很清晰:你本地用户的SSH环境和Jenkins运行时使用的用户环境完全不同。你在本地执行脚本时用的是自己的用户(me),这个用户已经通过了远程机器puppet-agent的主机密钥验证,甚至可能配置了SSH免密登录;但Jenkins默认是用jenkins系统用户来执行构建任务的,这个用户的~/.ssh目录里没有远程机器的主机密钥,也没有对应的SSH密钥对来免密登录远程机器,所以才会报Host key verification failed。
下面是一步步的解决步骤:
1. 解决主机密钥验证问题
首先让Jenkins用户(jenkins)信任远程机器的主机密钥:
- 登录到Jenkins所在的服务器,切换到jenkins用户:
sudo su - jenkins - 手动尝试连接一次远程机器,按提示输入
yes接受主机密钥:
完成后,远程机器的主机密钥会被保存到ssh me@puppet-agent/var/lib/jenkins/.ssh/known_hosts文件里,之后Jenkins再SSH连接就不会再报这个错误了。 - 如果不想手动交互,也可以用
ssh-keyscan直接添加主机密钥:ssh-keyscan puppet-agent >> /var/lib/jenkins/.ssh/known_hosts
2. 配置Jenkins用户的SSH免密登录
你的本地脚本能运行,大概率是你本地的me用户已经配置了SSH免密登录到远程puppet-agent的me用户,但Jenkins用户没有这个权限,所以需要给它配置:
- 还是在Jenkins服务器上,以jenkins用户身份生成SSH密钥对(一路回车即可):
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa - 将生成的公钥复制到远程
puppet-agent的me用户的授权列表里:
这时候需要输入一次远程ssh-copy-id me@puppet-agentme用户的密码,之后Jenkins用户就能免密SSH到远程机器了。
3. 优化脚本的安全性(可选但推荐)
你的脚本里用了echo "mepassword" | sudo -S这种明文密码的方式,非常不安全,建议改成让远程的me用户拥有免密sudo权限:
- 登录到远程
puppet-agent机器,编辑sudo配置:sudo visudo - 添加一行配置(替换成你的用户名):
保存退出后,远程的me ALL=(ALL) NOPASSWD: ALLme用户执行sudo就不需要输入密码了,脚本里的echo "mepassword" | sudo -S可以直接改成sudo。
另外,脚本里的sudo chmod 777 /etc/puppetlabs/puppet/puppet.conf权限设置过于宽松,存在安全隐患,建议改成:
sudo chown root:root /etc/puppetlabs/puppet/puppet.conf sudo chmod 644 /etc/puppetlabs/puppet/puppet.conf
按照这些步骤操作后,再去Jenkins里执行构建任务,应该就能正常运行脚本了。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

