จะคอมไพล์ repos ส่วนตัวภายใน Vagrant VM โดยใช้คีย์ SSH ของโฮสต์ได้อย่างไร


11

ฉันสามารถใช้ PuppetLabs vcsrepoเพื่อโคลน repos สาธารณะ git แต่ฉันก็อยากจะสามารถ repos ส่วนตัวโดยใช้กุญแจ SSH ของโฮสต์

การกำหนดค่าจะมีลักษณะเช่นไรVagrantfileและ / หรือmanifests/default.ppเพื่อให้บรรลุผลนี้

คำตอบ:


10

ฉันไม่สามารถช่วยเหลือส่วนหุ่นกระบอกได้ แต่คุณสามารถส่งต่อตัวแทน SSH ได้โดยการตั้งค่า:

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

วิธีนี้การเชื่อมต่อ SSH (ทำโดย git) ลองใช้คีย์ส่วนตัวของคุณจากโฮสต์


มีข้อผิดพลาดที่ทำให้สิ่งนี้ไม่ทำงานบน Windows ในกรณีส่วนใหญ่
Chase Sandmann

@ChaseSandmann คุณสามารถให้ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดได้หรือไม่ คุณมีลิงค์ไปสู่ปัญหา GitHub หรือไม่? ฉันได้พบตัวนี้แล้ว แต่ฉันคิดว่ามันไม่ใช่อันเนื่องมาจากดูเหมือนว่าเกี่ยวข้องกับ VirtualBox 5: github.com/mitchellh/vagrant/issues/6225
mastazi

5

ทำงานบนเครื่องของฉัน!

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

ปรากฏ / 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.shจำเป็นต้องมีเพื่อให้สามารถbootstrap.rbใช้งานได้
Monkpit

2

ฉันรู้ว่าคุณกำลังใช้ Puppet แต่ฉันลุกขึ้นแล้วใช้งานสคริปต์ทุบตีนี้ ( 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

เราสามารถแปลงเป็นหุ่นเชิดได้อย่างง่ายดาย ...

ร่วมกับสิ่งนี้ 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

จุดสำคัญสำหรับฉันคือเมื่อฉันดำเนินการ:

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"

มันไม่ได้ผล suถ้าเป็นกุญแจที่ไม่ได้ผ่านการใช้ ดังนั้นฉันจึงลอกแบบ repo เป็นรูทแล้วเปลี่ยนความเป็นเจ้าของในภายหลัง

โพสต์นี้มีประโยชน์มาก


Mate ..... ฉันพบกลุ่มโพสต์ที่ไม่มีประโยชน์พอสมควรเกี่ยวกับเรื่องนี้จนกระทั่งคุณ ไชโย !!!
Eric Hodonsky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.