Включите несколько Vagrant-файлов в один блок конфигурации do для настройки нескольких компьютеров - PullRequest
0 голосов
/ 10 марта 2019

TL; DR

Vagrant docs рекомендует один блок do |config| для определения нескольких машин.Я не могу заставить это работать при передаче каждого блока в одну частичную конфигурацию Vagrantfile, которая была включена.Кажется, он работает с несколькими блоками конфигурации, но параллельная инициализация не работает с VirtualBox.

РЕДАКТИРОВАТЬ: Кажется, что параллельное выполнение не работает на VirtualBox

Вопросы:

  1. Есть ли недостатки при наличии нескольких do |config| блоки для нескольких машин?
  2. Если да: как я могу включить несколько частичных файлов Vagrantfile с доступом к глобальному родительскому config объекту?

Подробное объяснение и предыстория

Я работаю над Vagrantfile, который должен создавать несколько машин с разными конфигурациями.Чтобы избежать путаницы в одном Vagrantfile, я хочу модульную конструкцию, подобную этой:

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

Документация Vagrant использует один блок config для определения нескольких машин внутри.Но все машины представлены в одном и том же Vagrantfile.Чтобы сохранить модульные, отдельные файлы, я нашел только этот репозиторий , где все частичные конфиги были включены вне блока config, поэтому в каждой конфигурации машины есть один блок config,На примере vagrant docs это выглядит так:

# 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 не содержит ни одного.Поскольку бродячие документы говорят:

И, что важно, вы также можете продолжать использовать объект конфигурации.

То, что я уже пробовал

Я попытался определить блок конфигурации в 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
  # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...