我能够使用 PuppetLabsvcsrepo
克隆公共 git 存储库,但我还希望能够使用主机的 SSH 密钥克隆私有存储库。
为了实现这一点,配置应该是什么样的Vagrantfile
?manifests/default.pp
答案1
我无法帮助解决 Puppet 部分的问题,但您可以通过设置来转发 SSH 代理:
Vagrant.configure("2") do |config|
config.ssh.forward_agent = true
# ...
end
这样,SSH 连接(也由 git 建立)就会尝试使用来自主机的私钥。
答案2
在我的機器上有效!
Vagrant文件:
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
升级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
清单/默认.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']
}
答案3
我知道您正在使用 Puppet,但我使用这个 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
人们可以轻松地将其转换为傀儡清单......
与此一起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 [email protected]:czerasz/some-app.git /home/$local_user/app"
没成功。好像密钥没有使用传递su
。所以我以 root 身份克隆了 repo,然后更改了所有权。
这个帖子非常有帮助。