如何一次在Vagrant中运行命令块

时间:2019-01-31 17:52:35

标签: vagrant vagrantfile

如何仅在Vagrantfile中运行命令块一次。尝试使用 if 情况,但不会成功。

Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

$hosts = {
    "node-1" => { memory: 1024, cpus: 2 },
    "node-2" => { memory: 4096, cpus: 2 }
}

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|      
  $hosts.each_with_index do |(hostname, parameters), index|  
    config.vm.define vm_name = hostname do |vm_config|
      vm_config.vm.hostname = hostname

      config.vm.provision "shell", inline: "echo index=#{index}"

      if index == 0
        config.vm.provision "shell", path: "./bootstrap-scripts/node-1.sh"
      end

    end
  end
end

控制台结果:

==> node-1: Importing base box 'generic/ubuntu1804'...
...
==> node-1: Running provisioner: shell...
    node-1: Running: inline script
    node-1: index=0

==> node-2: Importing base box 'generic/ubuntu1804'...
...
==> node-2: Running provisioner: shell...
    node-2: Running: inline script
    node-2: index=0
==> node-2: Running provisioner: shell...
    node-2: Running: inline script
    node-2: index=1

目标是仅在第一台计算机上运行“ ./bootstrap-scripts/control.sh”脚本。

1 个答案:

答案 0 :(得分:0)

来自vagrant documentation

  

多计算机定义和提供程序替代的内部部分是延迟加载的。如果您更改配置中使用的变量的值,则可能导致问题   ...

each_with_index的内部行为可能会触发已记录的陷阱,这就是为什么您的node-2遍历两个索引的原因。因此,请尝试在if中使用节点名称。

如果您想让供应商为每个节点申请,则还需要使用vm_config而不是config