Wie kann ich private Repos in Vagrant VM mithilfe der SSH-Schlüssel des Hosts klonen?

11

Ich kann PuppetLabs verwenden vcsrepo, um öffentliche Git-Repos zu klonen, aber ich möchte auch private Repos mit den SSH-Schlüsseln des Hosts klonen können.

Wie würde die Konfiguration aussehen Vagrantfileund / oder manifests/default.ppum dies zu erreichen?

Apennebaker
quelle

Antworten:

10

Ich kann mit dem Puppet-Teil nicht helfen, aber Sie können den SSH-Agenten weiterleiten, indem Sie Folgendes einstellen:

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

Auf diese Weise versuchen die SSH-Verbindungen (auch von Git hergestellt), Ihre privaten Schlüssel vom Host zu verwenden.

tmatilai
quelle
Es gibt einen Fehler, der dazu führt, dass dies in den meisten Fällen unter Windows nicht funktioniert.
Chase Sandmann
@ChaseSandmann können Sie weitere Informationen zu dem Fehler geben? Haben Sie einen Link zum Github-Problem? Ich habe dieses gefunden, aber ich denke, es ist nicht das, weil es mit VirtualBox 5 verwandt zu sein scheint: github.com/mitchellh/vagrant/issues/6225
mastazi
5

Funktioniert auf meiner Maschine!

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 [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
quelle
bootstrap.shmuss sein, damit bootstrap.rbdies funktioniert.
Monkpit
2

Ich weiß, dass Sie Puppet verwenden, aber ich habe es mit diesem Bash-Skript ( provisioners/shell/application.setup.sh) zum Laufen gebracht :

#!/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

Man könnte es leicht in ein Marionettenmanifest umwandeln ...

Zusammen damit 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

Der entscheidende Punkt für mich war, dass bei der Ausführung:

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"

Es hat nicht geklappt. Als ob die Schlüssel nicht mit übergeben würden su. Also habe ich das Repo als Root geklont und anschließend den Besitzer gewechselt.

Dieser Beitrag war sehr hilfreich.

czerasz
quelle
Kumpel ..... Ich habe ein paar ziemlich wenig hilfreiche Beiträge dazu gefunden, bis deine. Prost!!!
Eric Hodonsky