多机Vagrant项目不按文档配置

时间:2016-02-22 23:31:04

标签: vagrant homestead vagrant-provision

我正在尝试建立一个多机Vagrant项目。根据文档(https://www.vagrantup.com/docs/multi-machine/),供应是“在...之外”,这意味着在单个机器块中供应脚本之前执行任何顶级供应脚本。

该项目包含一个Laravel项目和一个Symfony项目。我的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 up块“流浪汉配置。

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

  

本机配置有误。请修正以下错误,然后重试:

     

VM:
  *必须指定一个方框。

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

  

带来机器' web'使用' virtualbox'供应商...
  带机器#api'使用' virtualbox'提供商...

那么我怎样才能让Vagrant首先运行我的shell脚本?我认为这是失败的,因为box组正在检查我的 web / Homestead.yaml 文件是否存在,如果存在,请使用其中的值进行配置(包括框名称),但是我的shell脚本尚未运行,并且没有克隆该文件不存在的存储库,因此没有指定git log --stat --oneline --relative=[path] ,Vagrant抱怨。

1 个答案:

答案 0 :(得分:0)

问题是您没有为box计算机定义web。您需要在外部空间中定义框,如

config.vm.box = "ubuntu/trusty64"

如果您打算为两台机器使用相同的盒子/操作系统或在web范围内定义

web.vm.box = "another box"

修改

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

Vagrantfile只是一个简单的ruby脚本,所以你可以添加你的脚本甚至执行它(来自ruby调用),我可以看到的一个潜在问题是你无法保证执行,特别是init的执行在漫无目的地在VM上做事之前,脚本将完成。

可能是使用vagrant trigger plugin并在up事件之前执行您的shell脚本

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

以这种方式运行,vagrant将在运行up命令的一部分之前等待脚本执行。

您需要对脚本进行一些检查以确保它仅在需要时运行,否则,它将在每次启动计算机时运行(调用vagrant up),例如:你可以检查一下yaml文件的存在