Vagabundo con Aprovisionamiento Ansible – Cómo hacer clonar un repository privado

Estoy usando Vagrant para configurar un server de desarrollo compartido. Intento utilizar Ansible para el aprovisionamiento (habiendo utilizado anteriormente scripts bash). Parece que no puedo configurar correctamente las cosas para que Ansible pueda clonar automáticamente nuestros repositorys privados de gitlab durante la etapa de aprovisionamiento.

Nuestro Vagrantfile es

Vagrant.configure("2") do |config| config.vm.box = "ubuntu/trusty64" config.vm.synced_folder /my/local/dir/, "/home/vagrant/repos" config.vm.synced_folder ".", "/vagrant" config.ssh.forward_agent = true config.vm.provision "ansible_local" do |ansible| ansible.playbook = "playbook.yml" end end 

Nuestro libro de jugadas básico parece

 --- - hosts: all sudo: true tasks: - name: update apt cache apt: update_cache=yes - name: install git apt: name=git state=present - name: clone test repo shell: ssh-keyscan -H our.private.gitlab.server >> ~/.ssh/known_hosts; ssh -T git@our.private.gitlab.server; git clone git@our.private.gitlab.server:me/amazing-repo.git 

Tengo un file ansible.cfg con el siguiente

 [ssh_connection] ssh_args = -o ForwardAgent=yes 

Recibo el siguiente error durante la etapa de provisión (a pesar de verificar en el equipo host con ssh-add -L que el agente tiene mi key)

Permiso denegado (key pública). \ R \ nCombinación en 'repo-increíble' … \ nDenegación denegada (key pública). \ R \ nfatal: no se pudo leer desde el repository remoto. \ N \ nAsegúrese de tener los derechos de acceso correctos \ ny el repository existe ".

He leído artículos como este y esto (y muchos más), pero no puedo hacerlo funcionar.

Solo quiero que el paso de provisión se encargue de clonar los repositorys. Luego los sincronizaré con mi máquina local, por lo que cualquier commit / push utilizará mi key ssh almacenada localmente.


Actualizar

Parece relacionado con este problema, pero no puedo ver ninguna resolución actualmente. La sugerencia de @ Lukáš Lalinský funciona en OSX pero no en Windows. En Windows, el paso de clonación de git falla durante el aprovisionamiento, pero si lo hago en la máquina, la key ssh se reenvía a la máquina virtual y existe SSH_AUTH_SOCK . Puedo clonar en esta etapa, solo que no durante el aprovisionamiento.

El problema es que cuando ejecuta sudo , pierde acceso al socket del agente SSH. La única forma de solucionar el problema es cambiando /etc/sudoers en el server para preservar la variable de entorno SSH_AUTH_SOCK .

Por ejemplo, agregue esto a /etc/sudoers como una de las primeras tareas en su libro de jugadas:

 Defaults env_keep += "SSH_AUTH_SOCK" 

Aquí están todas las configuraciones que necesitaba para hacer clonar un repository privado dentro de un cuadro Vagrant configurado por Ansible, con las siguientes versiones:

  • Vagrant 2.0.1
  • Ansible 2.4.1.0
  • Cuadro ubuntu/xenial64 – Ubuntu 16.04.3
  • VirtualBox 5.1.30 que probablemente no debería importar
  • macOS 10.13

En su Vagrantfile , configure su proveedor de Ansible para usar el reenvío de agente SSH:

 Vagrant.configure('2') do |config| # ... config.ssh.forward_agent = true # ... end 

Ahora, agregue su server git como sus hosts conocidos en guest:

 # todo: better to add to the file instead of overwrite, but only if not already present - name: set up bitbucket.org as a known host shell: 'ssh-keyscan -H bitbucket.org > /home/ubuntu/.ssh/known_hosts' 

A continuación, agregue la tarea para clonar el repository. Necesitamos especificar que la tarea no se debe ejecutar como raíz, para que el reenvío del agente SSH funcione:

 - name: clone repo become: no # to use ssh agent forwarding, must not be root git: repo: 'git@bitbucket.org:myuser/myrepo.git' dest: /path/to/myrepo 

En mi caso, esto resultó en un problema de permissions porque una vez que no estaba ejecutando git clone como root, ya no tenía permiso para crear el directory de destino. Así que agregué una tarea de file anterior para crear el directory como raíz con permissions editables.