Vagrant 多机流浪项目未按单据进行调配

Vagrant 多机流浪项目未按单据进行调配,vagrant,homestead,vagrant-provision,Vagrant,Homestead,Vagrant Provision,我正试图建立一个多机流浪项目。根据docs(),配置是“由外而内”,这意味着在各个机器块中配置脚本之前执行任何顶级配置脚本 该项目包含一个Laravel项目和一个Symfony项目。我的Vagrantfile如下所示: 需要“json” 需要“yaml” confDir=$confDir | |=File.expand_路径(“vendor/laravel/homestead”,File.dirname(uuu File_uu)) Homesteadyampath=“web/homestad.y

我正试图建立一个多机流浪项目。根据docs(),配置是“由外而内”,这意味着在各个机器块中配置脚本之前执行任何顶级配置脚本

该项目包含一个Laravel项目和一个Symfony项目。我的
Vagrantfile
如下所示:

需要“json”
需要“yaml”
confDir=$confDir | |=File.expand_路径(“vendor/laravel/homestead”,File.dirname(uuu File_uu))
Homesteadyampath=“web/homestad.yaml”
homestadejsonpath=“web/homestad.json”
afterScriptPath=“web/after.sh”
aliasesPath=“web/别名”
需要文件。展开路径(confDir+“/scripts/homestad.rb”)
Vagrant.configure(2)do | config|
config.vm.provision“shell”,路径:“init.sh”
config.vm.define“web”do | web|
web.ssh.forward_x11=true
如果File.com存在?那么别名路径呢
web.vm.provision“文件”,源:别名路径,目标:“~/.bash\u别名”
结束
如果File.com存在?家园之路
configure(web,YAML::load(File.read(homestadeyamlpath)))
如果文件.1存在?家园之路
configure(web,JSON.parse(File.read(homestadejsonpath)))
结束
如果File.com存在?那就走这条路吧
web.vm.provision“shell”,路径:afterScriptPath
结束
结束
config.vm.define“api”do | api|
api.vm.box=“ubuntu/trusty64”
api.vm.provider:virtualbox do | vb|
vb.customize[“modifyvm”,:id,“--memory”,“2048”]
结束
api.vm.network“专用网络”,ip:“10.1.1.34”
api.vm.network“转发端口”,来宾:80,主机:8001
api.vm.network“转发端口”,来宾:3306,主机:33061
api.vm.network“转发的_端口”,来宾:9200,主机:9201
api.vm.synced_文件夹“api”,“/var/www/api”
api.vm.provision“shell”,路径:“api/provision.sh”
结束
结束
我有一个用于Laravel项目的块(
web
),在那里我复制了基于宅地的
Vagrant文件
的内容,以及一个使用“标准”Vagrant配置的
api

为了引导这些项目,我创建了一个简单的shell脚本(init.sh),它只是将Git存储库克隆到Git忽略的目录中。鉴于文档中说配置是从外到内工作的,因此我希望脚本能够运行,然后机器特定的块会运行,但这似乎没有发生。相反,在
vagrant up
上,我收到以下错误:

这台机器的配置有错误。请修复以下错误并重试:

虚拟机:
*必须指定一个框

在运行shell脚本之前,它似乎仍在尝试配置各个机器。我知道shell脚本没有被调用,因为我向它添加了
echo
语句。相反,终端只输出以下内容:

正在使用“virtualbox”提供程序启动计算机“web”…
正在使用“virtualbox”提供程序启动计算机“api”


那么,如何让Vagrant先运行shell脚本呢?我认为这是失败的,因为
web
组正在检查我的web/Homestead.yaml文件是否存在,如果存在,请使用其中的值进行配置(包括框名),但由于我的shell脚本尚未运行且尚未克隆存储库,因此该文件不存在,因此未指定
box
,哪个流浪汉抱怨。

问题是您没有为
web
机器定义
框。您需要在外层空间中定义长方体,如

config.vm.box = "ubuntu/trusty64"
如果您计划对两台机器使用相同的box/OS或在
web
范围中定义

web.vm.box = "another box"
编辑

使用
provision
属性将在VM中运行脚本,这不是您想要的,因为您希望脚本在主机上运行。(因为它在VM中运行,所以需要先引导VM)

Vagrantfile只是一个简单的ruby脚本,因此您可以向它添加脚本甚至执行(从ruby调用),我可以看到的一个潜在问题是,您无法保证执行,特别是在vagrant在VM上执行之前,init脚本的执行将完成

一种可能性是在
up
事件之前使用并执行shell脚本

  config.trigger.before :up do
    info "Dumping the database before destroying the VM..."
    run  "init.sh"   
  end
以这种方式运行,vagrant将等待脚本执行,然后再运行
up
命令的一部分


您需要在脚本中执行一些检查,以确保它仅在需要时运行,否则,它将在每次启动计算机时运行(调用
vagrant up
),例如,您可以检查yaml文件的存在情况。根据我的问题,包括框名在内的值在web/Homestead.yaml中。我需要Vagrant运行我的init.sh脚本来首先克隆包含此文件的项目。这不是因为你在yaml文件中声明Vagrant会知道它,您仍然需要声明
config.vm.box
web.vm.box
的值,并指向yaml文件中的值我想我知道我的homestad.yaml文件中有什么。您可能想看看Laravel Homestead,因为它就是这样规定Vagrant的。Vagrant的错误很清楚
*必须指定一个框。
因此您不粘贴yaml文件,但clear Vagrant无法从所有配置文件中找到它需要使用的框,因此它不会启动,因为我的init.sh脚本没有运行,这将克隆包含Wagrant应该用来设置的Homestead.yaml文件的项目。