指定Vagrantfile路径显式,如果不是插件

时间:2013-06-25 22:26:54

标签: ruby plugins development-environment provisioning vagrant

有没有办法明确指定Vagrantfile的路径?我的公司希望做这样的事情:要在汇合机器上进行测试,请键入vagrant spinup confluence之类的命令,然后将其指向包含汇合环境的不同目录中的Vagrantfile,然后调出所有这些机器。

但是,看起来没有任何方法可以明确说明要使用的Vagrantfile,而且我在ruby中有点(非常)新的,所以我很难为它编写自己的插件。有没有人有关于该做什么的建议?或者有人做过类似的事情吗?

5 个答案:

答案 0 :(得分:52)

除了Andrew Lorente的回答,您还可以使用VAGRANT_VAGRANTFILE环境变量来指定Vagrantfile的文件名。这比VAGRANT_CWD更改当前工作目录更有优势,这在依赖相对路径时非常有用。

例如,以下内容将在vagrant up上运行Vagrantfile.other

VAGRANT_VAGRANTFILE=Vagrantfile.other vagrant up

注释

答案 1 :(得分:22)

不需要单独的Vagrantfile,您可以在同一个文件中定义多个VM。请参阅此处的文档:http://docs.vagrantup.com/v2/multi-machine/index.html

如果您只是在“正常”环境中使用一个虚拟机而在“融合”环境中使用一个虚拟机,则只需定义每个虚拟机并vagrant up - 特定虚拟机。

如果您有多台机器构成您的每个环境,那么您有两个选项,您可以使用正则表达式并确保正确命名和键入命令,或者您可以在Vagrantfile中添加一些逻辑来实现它对人们来说更容易。

例如,在Vagrantfile中有一点点黑客,你可以执行以下操作:

Vagrant.configure('2') do |config|

    if ARGV[1] == 'confluence'
        ARGV.delete_at(1)
        confluence = true
    else
        confluence = false
    end

    config.vm.provider :virtualbox do |virtualbox, override|

        #virtualbox.gui = true

        virtualbox.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
        virtualbox.customize ["modifyvm", :id, "--memory", 512]

        override.vm.box = 'Ubuntu 12.10 x64 Server'
        override.vm.box_url = 'http://goo.gl/wxdwM'

    end

    if confluence == false

        config.vm.define :normal1 do |normal1|

            normal1.vm.hostname = 'normal1'
            normal1.vm.network :private_network, ip: "192.168.1.1"

        end

        config.vm.define :normal2 do |normal2|

            normal2.vm.hostname = 'normal2'
            normal2.vm.network :private_network, ip: "192.168.1.2"

        end

    end

    if confluence == true

        config.vm.define :confluence1 do |confluence1|

            confluence1.vm.hostname = 'confluence1'
            confluence1.vm.network :private_network, ip: "192.168.1.3"

        end

        config.vm.define :confluence2 do |confluence2|

            confluence2.vm.hostname = 'confluence2'
            confluence2.vm.network :private_network, ip: "192.168.1.4"

        end

    end

end

现在vagrant up显示正常的vm,vagrant up confluence显示你的汇合vm!

答案 2 :(得分:19)

虽然其他回答者说这个特殊情况不需要单独的Vagrantfiles是正确的,但我认为有合法的用途来指定Vagrantfile路径 - 例如在脚本中读取vagrant ssh-config信息。

很高兴,您可以通过设置VAGRANT_CWD环境变量:

来实现
VAGRANT_CWD=~/some/path/ vagrant ssh-config

这似乎没有在任何地方记录,但您可以看到它in the source

答案 3 :(得分:2)

您可以根据需要添加任意数量的Vagrantfilecd。只需为您的项目创建一个新目录(然后可以只包含一个或多个VM),然后vagrant init到该目录并运行Vagrantfile以使Vagrant创建一个新的Vagrantfile然后可根据您的需求定制。要使用新的vagrant up启动VM,只需从包含它的目录中运行{{1}}。

答案 4 :(得分:1)

将shell命令放在括号中会创建一个子shell,所以从Git for Windows(或Linux / OS X上的bash),你可以这样做:

(cd test/ruby; vagrant up)