Проект 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, где я скопировал содержимое Homestead-based Vagrantfileи api блок, который использует "стандартную" конфигурацию Vagrant.

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

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

Виджей Малья:
* Поле должно быть указано.

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

Подвести машину к сети с провайдером virtualbox...
Загрузка машины 'api' с провайдером 'virtualbox'...

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

1 ответ

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

config.vm.box = "ubuntu/trusty64"

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

web.vm.box = "another box"

РЕДАКТИРОВАТЬ

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

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

Можно использовать плагин Vagrant Trigger и выполнить скрипт оболочки до того, как up событие

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

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

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

Другие вопросы по тегам