2017-06-06 86 views
0

我有一個Jenkins需要執行shell腳本的工作。它通過ssh密鑰連接到遠程計算機。以下是管道作業:在bash腳本中添加ssh密鑰(jenkins管道)

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 

問題是,有時這有效,有時不會。我認爲這是因爲用戶(這裏是詹金斯)的tty隨時都在變化,並且ssh-agent進程與tty相關聯。 我不想總是打電話給eval ssh-agent -s,因爲它會隨着時間的推移導致機器內存不足。

這裏ps aux | grep ssh-agent status:

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)

謝謝了很多:)

回答

1

我認爲這是因爲用戶(此處詹金斯)的TTY的這改變所有的時間和ssh-agent進程鏈接到一個tty。

否SSH代理未鏈接到tty。 SSH代理連接存儲在環境變量$SSH_AUTH_SOCK中,因此一旦您關閉啓動ssh-agent的原始shell,您將失去與代理的連接。

但是,您可以通過將環境變量存儲在文件中並將其加載到下一個shell中(如果is仍可用)或類似的東西來保留此連接。

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