我有一个需要执行shell脚本的Jenkins作业。它通过ssh键连接到远程计算机。这是管道工作:
stage ('Run') {
try {
sh "chmod +x \$(find . -name '*.sh')"
wrap([$class: 'AnsiColorBuildWrapper', 'colorMapName': 'XTerm']) {
sh "./run-ansible-playbook.sh -f ansible-playbook.yml"
}
etc...
.sh文件执行ssh-agent和ssh-add命令。
sshAgentCount=$(pgrep ssh-agent | wc -l)
if [[ $sshAgentCount -eq 0 ]]; then
echo "# run ssh-agent #"
eval `ssh-agent -s`
ssh-add /var/lib/jenkins/id_rsa_ansible
fi
问题在于,有时这种方法有效,有时则无效。我认为这是因为用户(这里是jenkins)的tty一直在变化,而ssh-agent进程被链接到tty。
我不想总是调用eval ssh-agent -s
,因为它会导致机器内存不足。
这里是ps aux | grep ssh-agent状态:
jenkins 1243 0.0 0.0 11140 320 ? Ss 17:20 0:00 ssh-agent -s
jenkins 1397 0.0 0.0 11140 320 ? Ss 17:23 0:00 ssh-agent -s
jenkins 1435 0.0 0.0 11140 320 ? Ss 17:23 0:00 ssh-agent -s
对于这个问题,你有一个优雅的解决方案吗? (仅在需要时使用一个ssh-agent)
非常感谢你:)
答案 0 :(得分:1)
我认为这是因为用户(这里是jenkins)的tty一直在变化,而ssh-agent进程被链接到tty。
没有。 SSH代理未链接到tty
。 SSH代理连接存储在环境变量$SSH_AUTH_SOCK
中,因此一旦关闭原始shell(启动ssh-agent
),您将失去与代理的连接。
但您可以通过将环境变量存储在文件中并将其加载到下一个shell(如果仍然可用)或类似的东西中来保留此连接。
答案 1 :(得分:0)
感谢您的回答。实际上它适用于文件。
但我发现更容易,只是在工作结束时终止了这个过程:
# add ssh key
echo "# run ssh-agent #"
eval `ssh-agent -s`
ssh-add /var/lib/jenkins/id_rsa_ansible
work...
kill $SSH_AGENT_PID