Comment faire pour clone des reposs privés dans Vagrant VM, en utilisant les clés SSH de l'hôte?

Je peux utiliser PuppetLabs vcsrepo pour cloner des git repos public, mais j'aimerais également cloner des repos privés, en utilisant les clés SSH de l'hôte.

À quoi ressemblerait la configuration pour Vagrantfile et / ou manifests/default.pp pour y parvenir?

Je ne peux pas aider avec la partie Puppet, mais vous pouvez transférer l'agent SSH en configurant:

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

De cette façon, les connexions SSH (également faites par git) essaient d'utiliser vos clés privées de l'hôte.

Fonctionne sur ma machine!

Vagrantfile:

 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 

Manifeste / 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'] } 

Je sais que vous utilisez Puppet, mais je l'ai mis en marche à l'aide de ce 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 

On pourrait facilement le convertir en un manifeste de marionnettes …

Ensemble avec ce 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 

Le point clé pour moi était que lorsque j'ai exécuté:

 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" 

Cela n'a pas fonctionné. Comme si les clés n'avaient pas été passées en utilisant su . J'ai donc cloné le compte de rechange en tant que root, puis j'ai changé de propriétaire par la suite.

Cette publication a été très utile.