Я пытаюсь настроить многомашинный проект 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 жалуется.