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.