Clave pública denegada al recuperar de Bitbucket en Ansbile con Jenkins

Lo que estoy tratando de hacer:

Tengo un script Ansible que hace un clon git de Bitbucket, y estoy ejecutando ese script de jenkins a través del plugin Ansible.

La ruta:

Jenkins server ---(ansible)---> App server ----(git)---> bitbucket.org 

Intento conectarme con el repository en Bitbucket desde el server de aplicaciones, usando la key privada ssh en el server de Jenkins, que debería ser posible con la ayuda de ssh-agent .

Lo que está pasando mal

La secuencia de commands de Ansible falla al conectarse a Bitbucket con Public key denied .

Lo que he verificado:

  1. La key pública en Jenkins se ha agregado para implementar la list de keys y funciona sin problemas de permissions.
  2. ssh-agent se ejecuta en el nodo jenkins y se ha agregado la key privada en jenkins.
  3. AllowFowardAgent se ha establecido en yes en el server.
  4. El complemento ansible para jenkins copy la key privada a /tmp y la usa cuando ejecuta libros de jugadas. No es la misma ruta de file a la que tengo ssh-add -ed, pero no creo que eso esté causando el problema.

El código de Jenkins

Antes de ejecutar la tarea Ansible, primero ejecuto el script de shell siguiente:

 eval `ssh-agent -s` ssh-add ~/.ssh/id_rsa cat >~/.ssh/config <<EOL Host * ForwardAgent yes EOL cat ~/.ssh/config git clone git@bitbucket.org:myuser/myrepo.git 

El código Ansible

Mi libro de jugadas:

 - name: check SSH_AUTH_SOCK shell: echo "$SSH_AUTH_SOCK" - name: check ssh-agent forwarding shell: ssh -T git@bitbucket.org 

Mi ansible.cfg :

 [ssh_connection] ssh_args = -o ForwardAgent=yes -o StrictHostKeyChecking=no -C -o ControlMaster=auto -o ControlPersist=60s 

La salida

En mi script Ansible puedo ver que SSH_AUTH_SOCK está configurado:

 11:29:04 changed: [testserver] => {"changed": true, "cmd": "echo \"$SSH_AUTH_SOCK\"", "delta": "0:00:00.007881", "end": "2016-09-06 11:29:04.576963", "invocation": {"module_args": {"_raw_params": "echo \"$SSH_AUTH_SOCK\"", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 0, "start": "2016-09-06 11:29:04.569082", "stderr": "", "stdout": "/tmp/ssh-WnmHgtzMBS/agent.13630", "stdout_lines": ["/tmp/ssh-WnmHgtzMBS/agent.13630"], "warnings": []} 

Pero ssh -T git@bitbucket.org falla:

 11:29:09 fatal: [testserver]: FAILED! => {"changed": true, "cmd": "ssh -T git@bitbucket.org", "delta": "0:00:05.009720", "end": "2016-09-06 11:29:09.879430", "failed": true, "invocation": {"module_args": {"_raw_params": "ssh -T git@bitbucket.org", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 255, "start": "2016-09-06 11:29:04.869710", "stderr": "Error reading response length from authentication socket.\r\nPermission denied (publickey).", "stdout": "", "stdout_lines": [], "warnings": []} 

Cuando ejecuta ssh-agent -s genera una serie de variables de entorno que son necesarias para la function de reenvío de agente de SSH, por ejemplo:

 SSH_AUTH_SOCK=/var/folders/nw/2vnhg_gj77v_cyfv0p1vdfj80000gn/T//ssh-alCh0yLKdoci/agent.53532; export SSH_AUTH_SOCK; SSH_AGENT_PID=53533; export SSH_AGENT_PID; echo Agent pid 53533; 

Cuando lo ejecuta a través de eval estos commands se ejecutan en la session del shell actual y puede ver el resultado del último ( echo ):

 Agent pid 53533 

Sin embargo, las variables de entorno están configuradas para el process y los subprocesss actuales. Si llama al libro de estrategias de Ansible desde un process diferente, no se verán.

Como ya descubrió, el complemento del agente SSH para Jenkins se ocupa de que otros processs (como el complemento Ansible) henetworkingen estas variables de entorno.