TL; DR
Vagrant docs рекомендует один блок do |config|
для определения нескольких машин.Я не могу заставить это работать при передаче каждого блока в одну частичную конфигурацию Vagrantfile, которая была включена.Кажется, он работает с несколькими блоками конфигурации, но параллельная инициализация не работает с VirtualBox.
РЕДАКТИРОВАТЬ: Кажется, что параллельное выполнение не работает на VirtualBox
Вопросы:
- Есть ли недостатки при наличии нескольких
do |config|
блоки для нескольких машин? - Если да: как я могу включить несколько частичных файлов 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
# ...