我正在使用 Vagrant v1.5.1 创建虚拟机 (VM) 集群。在供应了所有 VM 之后,是否可以在其中一台机器上运行单个脚本?我要运行的脚本将设置从一个 VM 到所有其他 VM 的无密码 SSH。
例如我在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 上运行一个脚本,以启用到 node2、node3 和 node4 的无密码 SSH。
我知道您可以在配置每个 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。在上面的方法中,这只适用于节点 1,但不适用于节点 2(因为节点 1 不会被配置)。
如果有一个 Vagrant 插件允许在我的集群中的所有节点之间使用密码 SSH,那就更好了。
最佳答案
这个问题已经有一年了,无论如何我发现它是因为我有同样的问题,所以这是我用来解决问题的解决方法,有人可能会觉得它有用。
我们需要“vagrant triggers”才能正常工作。 vagrant 触发器的问题是它们会为您正在创建的每台机器触发,但我们想确定所有机器都已启动的时刻。我们可以通过检查每个 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)上并行执行的提供程序。
关于ruby - 是否可以在 Vagrant 完成所有配置后在虚拟机上运行脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088568/