Проект 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