Comment git cloner des dépôts privés dans la VM Vagrant, en utilisant les clés SSH de l'hôte?


11

Je peux utiliser PuppetLabs vcsrepopour cloner des dépôts publics git, mais j'aimerais également pouvoir cloner des dépôts privés, en utilisant les clés SSH de l'hôte.

À quoi ressemblerait la configuration Vagrantfileet / ou manifests/default.pppour ce faire?

Réponses:


10

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

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

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


Il y a une erreur qui fait que cela ne fonctionne pas sous Windows dans la plupart des cas.
Chase Sandmann

@ChaseSandmann pouvez-vous donner plus d'informations sur l'erreur? Avez-vous un lien vers le problème github? J'ai trouvé celui-ci mais je pense que ce n'est pas celui-ci car il semble lié à VirtualBox 5: github.com/mitchellh/vagrant/issues/6225
mastazi

5

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

manifestes / default.pp:

exec { 'ssh know github':
  command => 'ssh -Tv git@github.com -o StrictHostKeyChecking=no; echo Success',
  path    => '/bin:/usr/bin',
  user    => 'vagrant'
}

vcsrepo { '/home/vagrant/a-private-repo':
  ensure   => latest,
  provider => git,
  source   => 'git@github.com:mcandre/a-private-repo.git',
  user     => 'vagrant',
  owner    => 'vagrant',
  group    => 'vagrant',
  require  => Exec['ssh know github']
}

bootstrap.shdoit être bootstrap.rbpour que cela fonctionne.
Monkpit

2

Je sais que vous utilisez Puppet mais je l'ai installé et exécuté en utilisant 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 git@bitbucket.org: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 manifeste de marionnettes ...

Avec cela 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 git@bitbucket.org:czerasz/some-app.git /home/$local_user/app"

Ça n'a pas marché. Comme si les clés n'étaient pas passées en utilisant su. J'ai donc cloné le dépôt en tant que root, puis changé de propriétaire par la suite.

Ce message a été très utile.


Mate ..... J'ai trouvé un tas de messages assez inutiles autour de cela jusqu'à la vôtre. À votre santé!!!
Eric Hodonsky
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.