ruby - 是否可以在 Vagrant 完成所有配置后在虚拟机上运行脚本?

标签 ruby vagrant vagrantfile centos6.5

我正在使用 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/

相关文章:

ruby - 如何根据编码字符串 Ruby 返回解码后的字符串

Ruby:避免数组中的无限循环使每个数字加倍

vagrant - 使用 vagrant 配置多个监视器

ruby - Ubuntu - 从另一台计算机 Vagrant 访问

Laravel Vagrant Up SSH 问题

Vagrant向上错误: superclass mismatch for class ImageNotConfiguredError

vagrant - 如何在 Vagrant 中为多机环境指定配置器默认值?

ruby - 在 Ruby 中通过 SSH 或 SFTP 获取存储库的大小

ruby-on-rails - 按 bool 值分组但在 ruby​​ on rails 中更改键

ssh - 在我的 VM 中我的 vagrant 根文件夹中看不到任何文件或文件夹