明确指定 Vagrantfile 路径,如果不是插件

Posted

技术标签:

【中文标题】明确指定 Vagrantfile 路径,如果不是插件【英文标题】:Specify Vagrantfile path explicity, if not plugin 【发布时间】:2013-06-22 22:00:16 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

VAGRANT_VAGRANTFILE=Vagrantfile.other vagrant up

注意事项

这曾经似乎是一个未记录的功能,只有visible in the source code。 在以后的版本中,这现在记录在 Hashicorp 文档中:Environmental Variables。

【讨论】:

【参考方案2】:

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

如果您只是在“正常”环境中使用一个 VM,而在“confluence”环境中使用一个 VM,那么只需定义每个 VM 并 vagrant up-ing 特定 VM。

如果您有多个机器组成每个环境,那么您有两个选择,您可以使用正则表达式并确保正确命名和键入命令,或者您可以在 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 调出你的普通虚拟机,vagrant up confluence 调出你的合流虚拟机!

【讨论】:

非常感谢,我不知道你可以在 Vagrantfile 中嵌入 ruby​​ :D 看到它是 ruby​​ 语法的我真傻。非常感谢!这正是我需要的答案。我可能会拥有所有可能环境的数组,然后针对每个环境检查 ARGV[1],然后调出所需的环境。这比我想象的要简单得多。【参考方案3】:

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

很高兴,您可以通过设置VAGRANT_CWD 环境变量来做到这一点:

VAGRANT_CWD=~/some/path/ vagrant ssh-config

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

【讨论】:

【参考方案4】:

您可以拥有任意数量的不同Vagrantfiles,只要您想要/需要。只需为您的项目创建一个新目录(然后可以只包含一个或多个 VM),然后 cd 进入该目录并运行 vagrant init 以使 Vagrant 创建一个新的 Vagrantfile 然后可以根据您的需要进行定制.要使用新的Vagrantfile 启动 VM,只需从包含它的目录中运行 vagrant up

【讨论】:

感谢您的回答,但我一直忙于将过去看起来像 Vagrantfile 的文件转换为成熟的 ruby​​ 应用程序来完成我想要的一切。随时查看github.com/jedmunds/vagrant,看看我在做什么!这是您可以扩展 vagrant 的令人难以置信的数量。【参考方案5】:

将 shell 命令放在括号中会创建一个子 shell,因此在 Windows 的 Git(或 Linux/OS X 上的 bash)中,您可以:

(cd test/ruby; vagrant up)

【讨论】:

【参考方案6】:

使用 VAGRANT_CWD 变量

VAGRANT_CWD 是 vagrant 查找 Vagrantfile 的目录

引用官方文档:

可以设置 VAGRANT_CWD 来改变 Vagrant 的工作目录。经过 默认情况下,Vagrant 使用您所在的当前目录。 目录很重要,因为它是 Vagrant 寻找 流浪文件。

【讨论】:

以上是关于明确指定 Vagrantfile 路径,如果不是插件的主要内容,如果未能解决你的问题,请参考以下文章

当明确给出 s3 路径时,模式合并不起作用

此函数是不是在所有控制路径上都有明确的返回值?

Typora设置图片插入路径

声明对象时,如果不明确,如何指定无名称

获取 IIS 条目的元数据库路径(安装已停止,因为指定的路径不是有效的 Web 应用程序)

为啥复制东西到U盘总显示;找不到指定文件 请确定指定的路径及文件名是不是正确 急急急急!!!