所以我使用http://puphpet.com/构建了一个虚拟机,它可以作为本地虚拟机正常工作。我现在的目标是在我的 prod 服务器上使用相同的东西,这样我就不必自己编写所有 puppet 的东西,更重要的是为 dev 和 prod 设置一个 puppet,这样它们就可以真正平等地设置。要使用 Vagrant 管理远程服务器,我使用这个插件:https ://github.com/tknerr/vagrant-managed-servers (我没有在他们的问题中发布,因为“问题”在我的 Vagrantfile 中的某个地方。
这是/曾经是我用于测试的 Vagrant 文件。它运行完美,但没有所有 Puppet 的东西。
流浪档案:
# -*- mode: ruby -*-
# vi: set ft=ruby :
# current dir
dir = File.dirname(File.expand_path(__FILE__))
Vagrant.configure("2") do |config|
#
# local machine
#
# vagrant up dev
# vagrant ssh dev
#
config.vm.define "dev", primary: true do |dev_config|
dev_config.vm.box = "puphpet/ubuntu1404-x64"
dev_config.vm.network :private_network, ip: "192.168.300.51"
end
#
# remote machine
#
# vagrant up prod --provider=managed
# vagrant ssh prod
#
config.vm.define "prod", autostart:false do |prod_config|
prod_config.vm.box = "tknerr/managed-server-dummy"
prod_config.vm.provider :managed do |managed_config, override|
managed_config.server = "xxx.xxx.xxx.xxx"
override.ssh.username = "user.name"
override.ssh.private_key_path = "#{dir}/puphpet/files/dot/ssh/id_rsa"
override.ssh.port = "2222"
end
end
end
然后我尝试将 Puppet 的东西添加到我的 Vagrant 文件中,我最终得到了这个怪物,它仍然能够连接到我的 prod 服务器,但不幸的是“vagrant provision”命令没有成功运行。
怪物流浪文件
# -*- mode: ruby -*-
# vi: set ft=ruby :
# load yaml for configs
require 'yaml'
# current dir
dir = File.dirname(File.expand_path(__FILE__))
# load config
configValues = YAML.load_file("#{dir}/puphpet/config.yaml")
data = configValues['vagrantfile-local']
Vagrant.require_version '>= 1.6.0'
Vagrant.configure("2") do |master_config|
#
# local machine
#
# vagrant up dev
# vagrant ssh dev
#
master_config.vm.define "dev", primary: true do |config|
config.vm.box = "#{data['vm']['box']}"
config.vm.box_url = "#{data['vm']['box_url']}"
if data['vm']['hostname'].to_s.strip.length != 0
config.vm.hostname = "#{data['vm']['hostname']}"
end
if data['vm']['network']['private_network'].to_s != ''
config.vm.network 'private_network', ip: "#{data['vm']['network']['private_network']}"
end
data['vm']['network']['forwarded_port'].each do |i, port|
if port['guest'] != '' && port['host'] != ''
config.vm.network :forwarded_port, guest: port['guest'].to_i, host: port['host'].to_i
end
end
if !data['vm']['post_up_message'].nil?
config.vm.post_up_message = "#{data['vm']['post_up_message']}"
end
if Vagrant.has_plugin?('vagrant-hostmanager')
hosts = Array.new()
if !configValues['apache']['install'].nil? &&
configValues['apache']['install'].to_i == 1 &&
configValues['apache']['vhosts'].is_a?(Hash)
configValues['apache']['vhosts'].each do |i, vhost|
hosts.push(vhost['servername'])
if vhost['serveraliases'].is_a?(Array)
vhost['serveraliases'].each do |vhost_alias|
hosts.push(vhost_alias)
end
end
end
elsif !configValues['nginx']['install'].nil? &&
configValues['nginx']['install'].to_i == 1 &&
configValues['nginx']['vhosts'].is_a?(Hash)
configValues['nginx']['vhosts'].each do |i, vhost|
hosts.push(vhost['server_name'])
if vhost['server_aliases'].is_a?(Array)
vhost['server_aliases'].each do |x, vhost_alias|
hosts.push(vhost_alias)
end
end
end
end
if hosts.any?
contents = File.open("#{dir}/puphpet/shell/ascii-art/hostmanager-notice.txt", 'r'){ |file| file.read }
puts "\n\033[32m#{contents}\033[0m\n"
if config.vm.hostname.to_s.strip.length == 0
config.vm.hostname = 'puphpet-dev-machine'
end
config.hostmanager.enabled = true
config.hostmanager.manage_host = true
config.hostmanager.ignore_private_ip = false
config.hostmanager.include_offline = false
config.hostmanager.aliases = hosts
end
end
if Vagrant.has_plugin?('vagrant-cachier')
config.cache.scope = :box
end
config.vm.usable_port_range = (data['vm']['usable_port_range']['start'].to_i..data['vm']['usable_port_range']['stop'].to_i)
if data['vm']['chosen_provider'].empty? || data['vm']['chosen_provider'] == 'virtualbox'
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'
config.vm.provider :virtualbox do |virtualbox|
data['vm']['provider']['virtualbox']['modifyvm'].each do |key, value|
if key == 'memory'
next
end
if key == 'cpus'
next
end
if key == 'natdnshostresolver1'
value = value ? 'on' : 'off'
end
virtualbox.customize ['modifyvm', :id, "--#{key}", "#{value}"]
end
virtualbox.customize ['modifyvm', :id, '--memory', "#{data['vm']['memory']}"]
virtualbox.customize ['modifyvm', :id, '--cpus', "#{data['vm']['cpus']}"]
if data['vm']['hostname'].to_s.strip.length != 0
virtualbox.customize ['modifyvm', :id, '--name', config.vm.hostname]
end
end
end
if data['vm']['chosen_provider'] == 'vmware_fusion' || data['vm']['chosen_provider'] == 'vmware_workstation'
ENV['VAGRANT_DEFAULT_PROVIDER'] = (data['vm']['chosen_provider'] == 'vmware_fusion') ? 'vmware_fusion' : 'vmware_workstation'
config.vm.provider 'vmware_fusion' do |v|
data['vm']['provider']['vmware'].each do |key, value|
if key == 'memsize'
next
end
if key == 'cpus'
next
end
v.vmx["#{key}"] = "#{value}"
end
v.vmx['memsize'] = "#{data['vm']['memory']}"
v.vmx['numvcpus'] = "#{data['vm']['cpus']}"
if data['vm']['hostname'].to_s.strip.length != 0
v.vmx['displayName'] = config.vm.hostname
end
end
end
if data['vm']['chosen_provider'] == 'parallels'
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'parallels'
config.vm.provider 'parallels' do |v|
data['vm']['provider']['parallels'].each do |key, value|
if key == 'memsize'
next
end
if key == 'cpus'
next
end
v.customize ['set', :id, "--#{key}", "#{value}"]
end
v.memory = "#{data['vm']['memory']}"
v.cpus = "#{data['vm']['cpus']}"
if data['vm']['hostname'].to_s.strip.length != 0
v.name = config.vm.hostname
end
end
end
ssh_username = !data['ssh']['username'].nil? ? data['ssh']['username'] : 'vagrant'
config.vm.provision 'shell' do |s|
s.path = 'puphpet/shell/initial-setup.sh'
s.args = '/vagrant/puphpet'
end
config.vm.provision 'shell' do |kg|
kg.path = 'puphpet/shell/ssh-keygen.sh'
kg.args = "#{ssh_username}"
end
config.vm.provision :shell, :path => 'puphpet/shell/install-ruby.sh'
config.vm.provision :shell, :path => 'puphpet/shell/install-puppet.sh'
config.vm.provision :puppet do |puppet|
puppet.facter = {
'ssh_username' => "#{ssh_username}",
'provisioner_type' => ENV['VAGRANT_DEFAULT_PROVIDER'],
'vm_target_key' => 'vagrantfile-local',
}
puppet.manifests_path = "#{data['vm']['provision']['puppet']['manifests_path']}"
puppet.manifest_file = "#{data['vm']['provision']['puppet']['manifest_file']}"
puppet.module_path = "#{data['vm']['provision']['puppet']['module_path']}"
if !data['vm']['provision']['puppet']['options'].empty?
puppet.options = data['vm']['provision']['puppet']['options']
end
end
config.vm.provision :shell do |s|
s.path = 'puphpet/shell/execute-files.sh'
s.args = ['exec-once', 'exec-always']
end
config.vm.provision :shell, run: 'always' do |s|
s.path = 'puphpet/shell/execute-files.sh'
s.args = ['startup-once', 'startup-always']
end
config.vm.provision :shell, :path => 'puphpet/shell/important-notices.sh'
if File.file?("#{dir}/puphpet/files/dot/ssh/id_rsa")
config.ssh.private_key_path = [
"#{dir}/puphpet/files/dot/ssh/id_rsa",
"#{dir}/puphpet/files/dot/ssh/insecure_private_key"
]
end
if !data['ssh']['host'].nil?
config.ssh.host = "#{data['ssh']['host']}"
end
if !data['ssh']['port'].nil?
config.ssh.port = "#{data['ssh']['port']}"
end
if !data['ssh']['username'].nil?
config.ssh.username = "#{data['ssh']['username']}"
end
if !data['ssh']['guest_port'].nil?
config.ssh.guest_port = data['ssh']['guest_port']
end
if !data['ssh']['shell'].nil?
config.ssh.shell = "#{data['ssh']['shell']}"
end
if !data['ssh']['keep_alive'].nil?
config.ssh.keep_alive = data['ssh']['keep_alive']
end
if !data['ssh']['forward_agent'].nil?
config.ssh.forward_agent = data['ssh']['forward_agent']
end
if !data['ssh']['forward_x11'].nil?
config.ssh.forward_x11 = data['ssh']['forward_x11']
end
if !data['vagrant']['host'].nil?
config.vagrant.host = data['vagrant']['host'].gsub(':', '').intern
end
end
#
# remote machine
#
# vagrant up prod --provider=managed
# vagrant ssh prod
#
master_config.vm.define "prod", autostart:false do |prod_config|
prod_config.vm.box = "tknerr/managed-server-dummy"
prod_config.vm.provider :managed do |managed_config, override|
managed_config.server = "xxx.xxx.xxx.xxx"
override.ssh.username = "user.name"
override.ssh.private_key_path = "#{dir}/puphpet/files/dot/ssh/id_rsa"
override.ssh.port = "2222"
end
if Vagrant.has_plugin?('vagrant-hostmanager')
hosts = Array.new()
if !configValues['apache']['install'].nil? &&
configValues['apache']['install'].to_i == 1 &&
configValues['apache']['vhosts'].is_a?(Hash)
configValues['apache']['vhosts'].each do |i, vhost|
hosts.push(vhost['servername'])
if vhost['serveraliases'].is_a?(Array)
vhost['serveraliases'].each do |vhost_alias|
hosts.push(vhost_alias)
end
end
end
elsif !configValues['nginx']['install'].nil? &&
configValues['nginx']['install'].to_i == 1 &&
configValues['nginx']['vhosts'].is_a?(Hash)
configValues['nginx']['vhosts'].each do |i, vhost|
hosts.push(vhost['server_name'])
if vhost['server_aliases'].is_a?(Array)
vhost['server_aliases'].each do |x, vhost_alias|
hosts.push(vhost_alias)
end
end
end
end
if hosts.any?
contents = File.open("#{dir}/puphpet/shell/ascii-art/hostmanager-notice.txt", 'r'){ |file| file.read }
puts "\n\033[32m#{contents}\033[0m\n"
prod_config.hostmanager.enabled = true
prod_config.hostmanager.manage_host = true
prod_config.hostmanager.ignore_private_ip = false
prod_config.hostmanager.include_offline = false
prod_config.hostmanager.aliases = hosts
end
end
if Vagrant.has_plugin?('vagrant-cachier')
prod_config.cache.scope = :box
end
prod_config.vm.provision 'shell' do |s|
s.path = 'puphpet/shell/initial-setup.sh'
s.args = '/vagrant/puphpet'
end
prod_config.vm.provision 'shell' do |kg|
kg.path = 'puphpet/shell/ssh-keygen.sh'
kg.args = "user.name"
end
prod_config.vm.provision :shell, :path => 'puphpet/shell/install-ruby.sh'
prod_config.vm.provision :shell, :path => 'puphpet/shell/install-puppet.sh'
prod_config.vm.provision :puppet do |puppet|
puppet.facter = {
'ssh_username' => "user.name",
'provisioner_type' => "managed",
}
puppet.manifests_path = "#{data['vm']['provision']['puppet']['manifests_path']}"
puppet.manifest_file = "#{data['vm']['provision']['puppet']['manifest_file']}"
puppet.module_path = "#{data['vm']['provision']['puppet']['module_path']}"
if !data['vm']['provision']['puppet']['options'].empty?
puppet.options = data['vm']['provision']['puppet']['options']
end
end
prod_config.vm.provision :shell do |s|
s.path = 'puphpet/shell/execute-files.sh'
s.args = ['exec-once', 'exec-always']
end
prod_config.vm.provision :shell, run: 'always' do |s|
s.path = 'puphpet/shell/execute-files.sh'
s.args = ['startup-once', 'startup-always']
end
prod_config.vm.provision :shell, :path => 'puphpet/shell/important-notices.sh'
end
end
命令行输出:
C:\VirtualMachines\VagrantBoxes\APP01>vagrant provision
==> dev: VM not created. Moving on...
==> prod: Warning! The ManagedServers provider doesn't support any of the Vagrant
==> prod: high-level network configurations (`config.vm.network`). They
==> prod: will be silently ignored.
==> prod: Warning! Folder sync disabled because the rsync binary is missing.
==> prod: Make sure rsync is installed and the binary can be found in the PATH.
==> prod: Running provisioner: shell...
prod: Running: C:/Users/Pascal/AppData/Local/Temp/vagrant-shell20141004-5396
-157lmpt.sh
==> prod: sudo: no tty present and no askpass program specified
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
chmod +x /tmp/vagrant-shell && /tmp/vagrant-shell /vagrant/puphpet
Stdout from the command:
Stderr from the command:
sudo: no tty present and no askpass program specified
据我了解,问题在于,当虚拟机位于远程服务器上时,流浪者无法像使用虚拟机那样创建共享文件夹。因此它无法访问 Puppet 文件并中断。
我的问题:有没有办法让 Puppet 在本地运行并将命令发送到服务器(使用 ssh),或者我可以将 Puppet 文件复制到服务器(不是 DRY,我知道,但我只是把它们在 git 的版本控制下并在我的本地机器和远程使用它们)?有没有人体验过这样的设置(或更好的解决方案)?
编辑:如果这有帮助:我的本地机器运行 Windows,但 VM 是 Ubuntu 14.04,远程机器上也运行 Ubuntu 14.04。我正在使用最新版本的 vagrant。