控制多机流浪块的执行顺序



我有一个多机器漫游设置,我需要更改一些块的执行顺序。

由于流浪顺序是由外向内的,嵌套最多的块最后执行。

我需要一种方法,使供应块更嵌套,使他们最后执行。我试过添加mach.vm.define,但这些块不执行,我不明白为什么。

正常执行,顺序错误

Vagrant.require_version ">= 1.6.0"
VAGRANTFILE_API_VERSION = "2"
require 'yaml'
machines = YAML.load_file('vagrant.yaml')
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  machines.each do |machine|
    config.vm.define machine["name"] do |mach|
      machine['run_this'].each do |run_this|
        mach.vm.provider "virtualbox" do |v, override|
          # should run first
        end
      end
      # Do a puppet provision to install the rest of the software
      mach.vm.provision "puppet" do |puppet|
        # puppet stuff
      end
      mach.vm.box = 'ubuntu/trusty64'
  end
end

理想的解决方案,但额外的嵌套块不执行

Vagrant.require_version ">= 1.6.0"
VAGRANTFILE_API_VERSION = "2"
require 'yaml'
machines = YAML.load_file('vagrant.yaml')
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  machines.each do |machine|
    config.vm.define machine["name"] do |mach|
      machine['run_this'].each do |run_this|
        mach.vm.provider "virtualbox" do |v, override|
          # should run first but it doesn't because it's in an extra provider block
        end
      end
      mach.vm.define :prov do |prov| # This block doesn't execute
        # Do a puppet provision to install the rest of the software
        prov.vm.provision "puppet" do |puppet|
          # puppet stuff
        end
      end
      mach.vm.box = 'ubuntu/trusty64'
    end
  end
end

是否有一种方法可以使配置更深一层,以便在提供程序块的内容之后运行?

编辑:任何特定于提供商的内容都是不可接受的(例如,另一个提供商块)或任何导致重复代码的内容。

我不知道你到底在第一个块上做什么,所以这就是为什么我假设它可以与内部块(与:run_this属性交互的块)反转。

通过这个小小的改变,我们可以把所有的执行块放在同一层。下面是我试图模拟你的问题的代码。

Vagrant.require_version ">= 1.6.0"
VAGRANTFILE_API_VERSION = "2"
require "yaml"
machines = YAML.load_file("vagrant.yml")
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  machines.each do |machine|
    config.vm.define machine["name"] do |mach|
      mach.vm.box = "ubuntu/trusty64"
      mach.vm.provision :shell, inline: "echo A"
      mach.vm.provider :virtualbox do |v, override|
        v.name = machine["name"]
        override.vm.provision :shell, inline: "echo B"
        machine["run_this"].each do |run_this|
          override.vm.provision :shell, inline: "echo C"
        end
        # puppet stuff should come here (all on the same level)
        override.vm.provision :shell, inline: "echo D"
      end
    end
  end
end

最新更新