控制多台机器Vagrant块的执行顺序

6
我有一个多机器的vagrant设置,其中有些块需要更改执行顺序。
由于vagrant的顺序是从外到内的,最嵌套的块最后执行。
我需要一种方法使提供程序块更嵌套,以便它们最后执行。我已经尝试添加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

有没有一种方法可以使配置更深层次,以便在提供程序块的内容之后运行?
编辑:任何特定于提供程序的内容都不可接受(例如,另一个提供程序块)或任何导致重复代码的内容。

在启动供应之前,您能解释一下您要做什么吗? - eddiemoya
我有一个自定义的同步文件夹功能,位于第一个提供程序块内,我希望在配置之前运行它。 - Sam
1个回答

1

我不知道你在第一个块上具体在做什么,所以我假设它可以与内部块(与: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

我无法这样做,因为这样做将会在非VirtualBox提供程序上运行provision步骤而需要复制代码。 - Sam
也许提供者也可以在YAML文件中。每个提供者都有自己特定的“run_this”会话。 - warantesbr
vagrant.yaml 文件中没有虚拟机或 Vagrant 语言,这是为了抽象出来。我会给你 200 分作为奖励,以免浪费。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接