¿Cómo obtener clones de repositorios privados dentro de Vagrant VM, usando las claves SSH del host?

11

Puedo usar PuppetLabs vcsrepopara clonar repositorios públicos de git, pero también me gustaría poder clonar repositorios privados, utilizando las claves SSH del host.

¿Cómo sería la configuración Vagrantfiley / o manifests/default.pppara lograr esto?

Apennebaker
fuente

Respuestas:

10

No puedo ayudar con la parte de Puppet, pero puede reenviar el Agente SSH configurando:

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

De esta manera, las conexiones SSH (también hechas por git) intentan usar sus claves privadas del host.

tmatilai
fuente
Hay un error que hace que esto no funcione en Windows en la mayoría de los casos.
Chase Sandmann
@ChaseSandmann, ¿puede dar más información sobre el error? ¿Tienes un enlace al problema de github? He encontrado este, pero creo que no es porque parece relacionado con VirtualBox 5: github.com/mitchellh/vagrant/issues/6225
mastazi
5

¡Funciona en mi máquina!

Archivo vagabundo:

VAGRANTFILE_API_VERSION = '2'

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = 'precise64'
  config.vm.box_url = 'http://files.vagrantup.com/precise64.box'

  #
  # Use host authenticaton for git and maven.
  #
  # Ensure host private key is registered with host SSH agent:
  #
  # ssh-add -L
  # ssh-add ~/.ssh/id_rsa
  # ssh-add -L
  #

  config.ssh.private_key_path = ['~/.vagrant.d/insecure_private_key', '~/.ssh/id_rsa']
  config.ssh.forward_agent = true

  config.vm.synced_folder "~/.m2", "/home/vagrant/.m2"

  config.vm.provision :shell, path: 'upgrade-puppet.sh'

  # Install puppet modules
  config.vm.provision :shell, path: 'bootstrap.rb', args: %w(
    puppetlabs-stdlib
    puppetlabs/apt
    puppetlabs/vcsrepo
  )

  config.vm.provision :puppet do |puppet|
    puppet.options = ENV['PUPPET_OPTIONS']
  end
end

upgrade-puppet.sh:

#!/bin/bash

apt-get install --yes lsb-release > /dev/null
DISTRIB_CODENAME=$(lsb_release --codename --short)
DEB="puppetlabs-release-${DISTRIB_CODENAME}.deb"
DEB_PROVIDES="/etc/apt/sources.list.d/puppetlabs.list" # Assume that this file's existence means we have the Puppet Labs repo added

if [ ! -e $DEB_PROVIDES ]
then
    # Print statement useful for debugging, but automated runs of this will interpret any output as an error
    # print "Could not find $DEB_PROVIDES - fetching and installing $DEB"
    wget -q http://apt.puppetlabs.com/$DEB
    sudo dpkg -i $DEB
fi
sudo apt-get update > /dev/null
sudo apt-get install --yes puppet > /dev/null

mkdir -p /etc/puppet
touch /etc/puppet/hiera.yaml

bootstrap.sh:

#!/usr/bin/env ruby

modules_dir = '/etc/puppet/modules'

puts `mkdir -p #{modules_dir}` unless File::exists? modules_dir

mods = ARGV

installed = `puppet module list`.split "\n"

mods.each do |mod|
  puts `puppet module install #{mod}` unless installed.any? { |i| i.include?(mod.sub('/','-')) }
end

manifiestos / default.pp:

exec { 'ssh know github':
  command => 'ssh -Tv [email protected] -o StrictHostKeyChecking=no; echo Success',
  path    => '/bin:/usr/bin',
  user    => 'vagrant'
}

vcsrepo { '/home/vagrant/a-private-repo':
  ensure   => latest,
  provider => git,
  source   => '[email protected]:mcandre/a-private-repo.git',
  user     => 'vagrant',
  owner    => 'vagrant',
  group    => 'vagrant',
  require  => Exec['ssh know github']
}
Apennebaker
fuente
bootstrap.shnecesita ser bootstrap.rbpara que esto funcione.
Monkpit
2

Sé que estás usando Puppet pero lo puse en funcionamiento usando este script bash ( provisioners/shell/application.setup.sh):

#!/bin/bash

local_user=vagrant

if [ ! -n "$(grep "^bitbucket.org " /home/$local_user/.ssh/known_hosts)" ]; then 
    ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null;
fi

if [[ ! -d "/home/$local_user/app" ]]; then
    git clone [email protected]:czerasz/some-app.git /home/$local_user/app

    chown -R $local_user:$local_user /home/$local_user/app

    su - $local_user -c "source /usr/local/bin/virtualenvwrapper.sh && mkvirtualenv some-env && workon some-env && pip install -r /home/$local_user/app/requirements.txt"
fi

Uno podría convertirlo fácilmente en un manifiesto de marionetas ...

Junto con esto Vagrantfile

config.vm.define "web1", primary: true do |web1_config|
    web1_config.ssh.forward_agent = true

    # Create a private network, which allows host-only access to the machine
    web1_config.vm.network "private_network", ip: "192.168.11.10"
    web1_config.vm.hostname = "web1.#{domain}"

    web1_config.vm.provision "shell", path: "provisioners/shell/python.setup.sh"
    web1_config.vm.provision "shell", path: "provisioners/shell/application.setup.sh"
end

El punto clave para mí fue que cuando ejecuté:

su - $local_user -c "ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null;"
su - $local_user -c "git clone [email protected]:czerasz/some-app.git /home/$local_user/app"

No funcionó. Como si las claves no se pasaran usando su. Así que cloné el repositorio como root y luego cambié la propiedad.

Esta publicación fue muy útil.

czerasz
fuente
Compañero ..... Encontré un montón de publicaciones bastante inútiles alrededor de esto hasta la tuya. ¡¡¡Salud!!!
Eric Hodonsky