Проект Vagrant с несколькими машинами не предоставляется в соответствии с документами

Я пытаюсь настроить многомашинный проект Vagrant. Согласно документации (https://www.vagrantup.com/docs/multi-machine/) подготовка выполняется «снаружи внутрь», что означает, что любые сценарии подготовки верхнего уровня выполняются перед сценариями подготовки в отдельных блоках компьютера.

Проект содержит проект Laravel и проект Symfony. Мой Vagrantfile выглядит так:

require "json"
require "yaml"

confDir = $confDir ||= File.expand_path("vendor/laravel/homestead", File.dirname(__FILE__))

homesteadYamlPath = "web/Homestead.yaml"
homesteadJsonPath = "web/Homestead.json"
afterScriptPath = "web/after.sh"
aliasesPath = "web/aliases"

require File.expand_path(confDir + "/scripts/homestead.rb")

Vagrant.configure(2) do |config|
  config.vm.provision "shell", path: "init.sh"

  config.vm.define "web" do |web|
    web.ssh.forward_x11 = true

    if File.exists? aliasesPath then
      web.vm.provision "file", source: aliasesPath, destination: "~/.bash_aliases"
    end

    if File.exists? homesteadYamlPath then
      Homestead.configure(web, YAML::load(File.read(homesteadYamlPath)))
    elsif File.exists? homesteadJsonPath then
      Homestead.configure(web, JSON.parse(File.read(homesteadJsonPath)))
    end

    if File.exists? afterScriptPath then
      web.vm.provision "shell", path: afterScriptPath
    end
  end

  config.vm.define "api" do |api|
    api.vm.box = "ubuntu/trusty64"

    api.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "2048"]
    end

    api.vm.network "private_network", ip: "10.1.1.34"
    api.vm.network "forwarded_port", guest: 80, host: 8001
    api.vm.network "forwarded_port", guest: 3306, host: 33061
    api.vm.network "forwarded_port", guest: 9200, host: 9201

    api.vm.synced_folder "api", "/var/www/api"

    api.vm.provision "shell", path: "api/provision.sh"
  end
end

У меня есть блок (web) для проекта Laravel, куда я скопировал содержимое Vagrantfile на основе Homestead, и блок api, использующий «стандартную» конфигурацию Vagrant.

Чтобы запустить проекты, я создал простой сценарий оболочки (init.sh), который просто клонирует репозитории Git в игнорируемые git каталоги. Учитывая, что в документации говорится, что конфигурация работает извне внутрь, поэтому я ожидаю, что этот скрипт запустится, а затем машинно-зависимые блоки, но, похоже, этого не происходит. Вместо этого на vagrant up я получаю следующую ошибку:

В конфигурации этой машины есть ошибки. Исправьте следующие ошибки и повторите попытку:

vm:
* Должен быть указан ящик.

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

Подключение "web" машины к провайдеру "virtualbox"...
Подключение "api" машины к провайдеру "virtualbox"...

Итак, как я могу заставить Vagrant сначала запустить мой сценарий оболочки? Я думаю, что это не удается, потому что группа web проверяет, существует ли мой файл web/Homestead.yaml, и если да, используйте его значения для настройки (включая имя ящика), но, поскольку мой сценарий оболочки не имеет не запускался и не клонировал репозиторий, этот файл не существует, поэтому не указан box, на что Vagrant жалуется.


person Martin Bean    schedule 22.02.2016    source источник


Ответы (1)


Проблема в том, что вы не определяете box для машины web. Вам нужно либо определить поле в космическом пространстве, например

config.vm.box = "ubuntu/trusty64"

если вы планируете использовать одну и ту же коробку/ОС для обеих машин или определите в области web

web.vm.box = "another box"

ИЗМЕНИТЬ

Использование свойства provision запустит сценарий на виртуальной машине, чего здесь не требуется, так как вы хотите, чтобы сценарий выполнялся на вашем хосте. (и поскольку он работает на виртуальной машине, сначала необходимо загрузить виртуальную машину)

Vagrantfile — это просто простой сценарий ruby, поэтому вы можете добавить к нему свой сценарий или даже выполнение (из вызова ruby), потенциальная проблема, которую я вижу, заключается в том, что вы не можете гарантировать выполнение и особенно то, что выполнение вашего сценария инициализации будет завершить до того, как бродяга сделает что-то на виртуальной машине.

Можно использовать плагин бродячих триггеров и выполнить сценарий оболочки до события up.

  config.trigger.before :up do
    info "Dumping the database before destroying the VM..."
    run  "init.sh"   
  end

Запустив его таким образом, vagrant будет ждать выполнения скрипта, прежде чем он выполнит свою часть команды up.

Вам нужно будет выполнить некоторую проверку в своем скрипте, чтобы убедиться, что он запускается только тогда, когда это необходимо, в противном случае он будет запускаться каждый раз, когда вы запускаете машину (вызывая vagrant up), например. можно было бы проверить наличие файла yaml

person Frederic Henri    schedule 23.02.2016
comment
Согласно моему вопросу, значения включая имя ящика находятся в web/Homestead.yaml. Мне нужно, чтобы Vagrant запустил мой скрипт init.sh, чтобы сначала клонировать проект, содержащий этот файл. - person Martin Bean; 23.02.2016
comment
Это не потому, что вы объявляете в своем файле yaml, что бродяга будет знать об этом, вам все равно нужно объявить значение для config.vm.box или web.vm.box и указать значение из вашего файла yaml - person Frederic Henri; 23.02.2016
comment
Кажется, я знаю, что находится в моем файле Homestead.yaml. Вы можете взглянуть на Laravel Homestead, так как именно так он обеспечивает Vagrant. - person Martin Bean; 23.02.2016
comment
ошибка от бродяги прямо ясна * A box must be specified., поэтому вы не вставляете свой файл yaml, но ясный бродяга не может найти из всего вашего файла конфигурации, какое поле ему нужно использовать, поэтому он не запускается - person Frederic Henri; 23.02.2016
comment
Да, потому что мой скрипт init.sh не запущен, который будет клонировать проект, содержащий файл Homestead.yaml, который Vagrant должен использовать для предоставления. - person Martin Bean; 23.02.2016
comment
@MartinBean на этот раз я правильно понял? плагин триггера помог в вашем случае? - person Frederic Henri; 25.02.2016