【问题标题】:Control multi-machine Vagrant block execution order控制多机 Vagrant 块执行顺序
【发布时间】:2015-08-25 12:03:48
【问题描述】:

我有一个多机 vagrant 设置,其中包含一些我需要更改执行顺序的块。

由于 vagrant order 在外-内最嵌套的块最后执行。

我需要一种方法来使配置块更加嵌套,以便它们最后执行。我试过添加 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

有没有办法让配置更深一层,以便在提供程序块的内容之后运行?

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

【问题讨论】:

  • 您能解释一下在配置开始之前您到底想要做什么吗?
  • 我在第一个提供程序块中有一个自定义同步文件夹功能,我想在配置之前运行它

标签: ruby vagrant provisioning


【解决方案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

【讨论】:

  • 我不能这样做,因为它不会在不复制代码的情况下在非虚拟机提供程序上运行配置步骤
  • 也许提供者也可以在 YAML 文件中。每个都有您特定的“run_this”会话。
  • vagrant.yaml 中没有 VM 或 vagrant 语言,我们的想法是从中抽象出来,我会给你 200 个代表,以免浪费它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 2020-02-06
  • 2019-03-13
  • 2016-06-26
  • 2019-08-01
相关资源
最近更新 更多