在一个do config块中包含多个Vagrantfile,以进行多机设置

时间:2019-03-10 11:47:22

标签: ruby-on-rails ruby vagrant virtualbox vagrantfile

TL; DR

Vagrant文​​档建议使用一个do |config|块来定义多台计算机。当将每个盒子外包到一个单独的部分Vagrantfile配置文件中时,我无法执行此工作。它似乎可以与多个配置块一起使用,但是使用VirtualBox不能并行配置。

编辑:Parallel execution doesn't seem to work on VirtualBox

问题:

  1. 在多台计算机上使用多个do |config|块有什么缺点?
  2. 如果是:如何包含多个Vagrantfile局部文件并可以访问全局父config对象?

详细说明和背景

我正在处理一个Vagrantfile,该文件应创建具有不同配置的多台计算机。为了避免弄乱单个Vagrantfile,我需要这样的模块化设计:

Vagrantfile
vagrant
  -- Vagrantfile.service1
  -- Vagrantfile.service2

The Vagrant documentation使用单个config块定义内部的多台计算机。但是所有机器都在同一个Vagrantfile中提供。为了保持模块化的,分离的文件,我只发现了this repo,其中所有部分配置都包含在config块的 outside 中,因此每个文件中只有一个config块机器配置。在流浪汉文档示例中,它看起来像这样:

# File Vagrantfile-service1
Vagrant.configure("2") do |config|
  config.vm.box = "apache"
end

# File Vagrantfile-service2
Vagrant.configure("2") do |config|
  config.vm.box = "mysql"
end

但是根据github示例,我需要像这样在基Vagrantfile中包含这些文件:

path1 = "vagrant/Vagrantfile.service1"
load File.expand_path(path1)  if File.exists?(path1)

path2 = "vagrant/Vagrantfile.service2"
load File.expand_path(path2)  if File.exists?(path2)

如您所见,这仅适用于多个do |config|部分。基本的Vagrantfile不包含任何内容。由于无业游民的文档说:

  

重要的是,您也可以继续使用config对象。

我已经尝试过的东西

我试图在Vagrantfile中定义一个配置块并包含我的部分文件:

Vagrant.configure("2") do |config|
  path1 = "vagrant/Vagrantfile.service1"
  load File.expand_path(path1)  if File.exists?(path1)
  # ...
end

想法是在config中使用vagrant/Vagrantfile.service1对象,以便该文件仅包含

config.vm.define "web" do |web|
  web.vm.box = "apache"
end

适合无业游民的文档。但这是行不通的。尽管我不太熟悉Ruby,但看来config必须是基数Vagrantfile中的全局变量。所以我尝试了

Vagrant.configure("2") do |$config|
  path1 = "vagrant/Vagrantfile.service1"
  load File.expand_path(path1)  if File.exists?(path1)
  # ...
end

通知$config使其全局,从而导致此错误:

Vagrantfile:21: formal argument cannot be a global variable
grant.configure(2) do |$config|
                              ^

我也尝试了以下失败的尝试:

Vagrant.configure(2) do |_config|
  $config = _config
  # ...

1 个答案:

答案 0 :(得分:0)

请尝试使用load来代替eval中的父项Vagrantfile config

vagrant/Vagrantfile.service1