Bagaimana cara mendapatkan repo pribadi di dalam Vagrant VM, menggunakan kunci SSH host?

11

Saya dapat menggunakan PuppetLabs vcsrepountuk mengkloning repositori publik git, tetapi saya juga ingin mengkloning repositori pribadi, menggunakan kunci SSH host.

Seperti apa konfigurasi untuk Vagrantfiledan / atau manifests/default.ppuntuk mencapai ini?

apennebaker
sumber

Jawaban:

10

Saya tidak bisa membantu dengan bagian Wayang, tetapi Anda dapat meneruskan Agen SSH dengan menetapkan:

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

Dengan cara ini koneksi SSH (juga dibuat oleh git) mencoba menggunakan kunci pribadi Anda dari host.

tmatilai
sumber
Ada kesalahan yang menyebabkan ini tidak berfungsi pada Windows dalam banyak kasus.
Chase Sandmann
@ ChaseSandmann dapatkah Anda memberikan lebih banyak info tentang kesalahan? Apakah Anda memiliki tautan ke masalah github? Saya telah menemukan yang ini tetapi saya pikir itu bukan yang karena tampaknya terkait dengan VirtualBox 5: github.com/mitchellh/vagrant/issues/6225
mastazi
5

Bekerja pada mesin saya!

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

manifes / 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
sumber
bootstrap.shperlu agar bootstrap.rbini bekerja.
Monkpit
2

Saya tahu Anda menggunakan Wayang, tetapi saya menjalankannya menggunakan skrip bash ini ( 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

Orang bisa dengan mudah mengubahnya menjadi manifes wayang ...

Bersama dengan ini 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

Poin kunci bagi saya adalah ketika saya mengeksekusi:

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"

Itu tidak berhasil. Seolah kunci tidak dilewati menggunakan su. Jadi saya mengkloning repo sebagai root dan kemudian mengubah kepemilikan sesudahnya.

Posting ini sangat membantu.

Czerasz
sumber
Sobat ..... Saya menemukan banyak posting yang cukup tidak membantu di sekitar ini sampai Anda. Bersulang!!!
Eric Hodonsky