2017-06-06 2 views
0

J'ai un travail Jenkins qui doit exécuter un script shell. Il fait une connexion via la clé ssh à un ordinateur distant. Voici le travail de pipeline:Ajouter une clé ssh dans le script bash (pipeline 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... 

Le fichier .sh fait le ssh-agent et les commandes 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 

Le problème est que cela fonctionne parfois et parfois non. Je pense que c'est à cause du tty de l'utilisateur (ici jenkins) qui change tout le temps et le processus ssh-agent est lié à un tty. Je ne veux pas appeler eval ssh-agent -s toujours parce que cela cause un manque de mémoire sur la machine par le temps.

Voici la ps aux | grep Statut 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 

Avez-vous une solution élégante à ce problème? (Un ssh-agent que si nécessaire)

Merci beaucoup :)

Répondre

1

Je pense qu'il est à cause de la TTY de l'utilisateur (ici jenkins) qui change tout le temps et le processus ssh-agent est lié à un tty.

L'agent SSH n'est pas lié à tty. La connexion de l'agent SSH est stockée dans la variable d'environnement $SSH_AUTH_SOCK. Une fois que vous aurez fermé le shell d'origine, qui a démarré le ssh-agent, vous perdrez la connexion à l'agent.

Mais vous pouvez conserver cette connexion en stockant la variable d'environnement dans le fichier et en la chargeant dans les prochains shells (si elle est encore utilisable) ou des choses similaires.

0

Merci pour votre réponse. En effet cela fonctionne avec un fichier.

Mais j'ai trouvé quelque chose plus facile, juste tuer le processus à la fin du travail:

# add ssh key 
echo "# run ssh-agent #" 
eval `ssh-agent -s` 
ssh-add /var/lib/jenkins/id_rsa_ansible 

work... 

kill $SSH_AGENT_PID