我正在使用Vagrant v1.5.1来创建虚拟机(VM)群集.配置完所有虚拟机后,是否可以在其中一台机器上运行单个脚本?我想运行的脚本将从一个VM设置无密码SSH到所有其他VM.
例如,我在Vagrant(CentOS 6.5)中配置的节点如下.
节点1
节点2
节点3
节点4
我Vagrantfile
看起来如下.
(1..4).each do |i| config.vm.define "node-#{i}" do |node| node.vm.box = "centos65" ...omitted.. end end
完成所有这些操作后,我需要在node1上运行脚本以启用无密码SSH到node2,node3和node4.
我知道您可以在配置每个VM时运行脚本,但在这种情况下,我希望在配置所有VM后运行脚本,因为我需要启动并运行所有VM才能运行最后一个脚本.
在Vagrant中这可能吗?
我意识到我也可以向后迭代.
r = 4..1 (r.first).downto(r.last).each do |i| config.vm.define "node-#{i}" do |node| node.vm.box = "centos65" ...omitted.. if i == 1 node.vm.provision "shell" do |s| s.path = "/path/to/script.sh" end end end end
这将很好用,但实际上,我还需要设置从node2到node1,node3和node4的无密码SSH.在上面的方法中,这只能用于node1,但不适用于node2(因为node1不会被配置).
如果有一个Vagrant插件允许在我的集群中的所有节点之间进行密码SSH,那甚至会更好.
这个问题只有一岁了,无论如何我发现它是因为我遇到了同样的问题,所以这是我用来解决问题的工作环境,有人可能会觉得有用。
我们需要“ 游荡的触发器 ”才能使其正常工作。流浪汉触发器的作用是,它们会触发您正在创建的每台计算机,但是我们要确定所有计算机何时启动。我们可以通过检查每个UP事件是否对应于最后创建的机器来做到这一点:
Vagrant.configure("2") do |config| (1..$machine_count).each do |i| config.vm.define vm_name = "w%d" % i do |worker| worker.vm.hostname = vm_name workerIP = IP worker.vm.network :private_network, ip: workerIP worker.trigger.after :up do if(i == $machine_count) then info "last machine is up" run_remote "bash /vagrant/YOUR_SCRIPT.sh" end end end end end
这适用于不支持在Vagrant(VBox,VMWare)上并行执行的提供程序。