明确指定 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】:您可以拥有任意数量的不同Vagrantfile
s,只要您想要/需要。只需为您的项目创建一个新目录(然后可以只包含一个或多个 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 路径,如果不是插件的主要内容,如果未能解决你的问题,请参考以下文章