Vagrant Multi-Machine功能似乎很酷,但有一件困扰我(或者不是立即显而易见)的事情是,似乎没有一种好的方法来共享“父”Vagrantfile和“孩子们”Vagrantfiles。有没有办法有效和可维护地共享父母和孩子之间的配置选项?一个例子可能会使这一点更加明确。
我们假设我有一个由3个应用程序/服务组成的平台:API,Web和Worker。
让我们假设以下目录结构:
/some_platform
/api
# app code...
Vagrantfile
/web
# app code...
Vagrantfile
/worker
# app code...
Vagrantfile
Vagrantfile
让我们说/some_platform/api/Vagrantfile
看起来像:
Vagrant.configure("2") do |config|
config.vm.box = "debian/jessie64"
end
据推测,网络和工作人员Vagrantfiles看起来很相似。
现在,使用Multi-Machine的奇迹我依靠Vagrant协调这些VM,/some_platform/Vagrantfile
看起来像:
Vagrant.configure("2") do |config|
config.vm.define "web" do |api|
api.vm.box = "debian/jessie64"
end
config.vm.define "web" do |web|
web.vm.box = "debian/jessie64"
end
config.vm.define "web" do |worker|
worker.vm.box = "debian/jessie64"
end
end
我意识到这个例子是人为的,但很容易看出,一旦你得到越来越复杂的配置声明,将配置复制到两个地方是很烦人和危险的。
您可能想知道“为什么每个项目都拥有自己的Vagrantfile?”这样做提供了应该如何设置应用程序运行的服务器的单一事实来源。我意识到有一些你可以使用的配置器(我会使用它们),但是你仍然需要声明一些其他的东西,我想保持干燥,这样我就可以通过Multi-提出一个应用程序集群机器,或者我可以在一个应用程序上工作并更改它的VM /服务器设置。
我真正喜欢的是将其他Vagrantfiles合并为“父”文件的方法。
这可能吗?或者我为尝试而疯狂?关于如何实现这一点的任何聪明的想法?我已经讨论了一些yaml文件和PORO来解决这个问题,但没有一个黑客感到非常满意。
答案 0 :(得分:1)
你可以看两件事(可能更多,但这两件事在我脑海中浮现)
以How to template Vagrantfile using Ruby?为例,看看如何阅读另一个文件的内容,Vagrantfile只是一个ruby脚本,所以你可以使用ruby的所有功能。
vagrant有加载和合并的概念,请参阅from doc所以如果你想做任何时候你运行一个vagrant命令,你可以在你的{下面创建一个Vagrantfile {1}}文件夹,它将始终运行
一个缺点(或至少要注意):Vagrantfile是一个ruby脚本,评估每个(并且每次)执行一个vagrant命令(up,status,halt ...... 。)
答案 1 :(得分:1)
好消息!
实际上,您可以在Vagrantfile中应用DRY principles。
首先:创建文件/some_platform/DRY_vagrant/Vagrantfile.sensible
来保存一些合理的默认值:
Vagrant.configure("2") do |config|
# With the setting below, any vagrantfile VM without a 'config.vm.box' will
# automatically inherit "debian/jessie64"
config.vm.box = "debian/jessie64"
end
第二步:为“工人”虚拟机创建文件/some_platform/DRY_vagrant/Vagrantfile.worker
:
Vagrant.configure("2") do |config|
config.vm.define "worker" do |worker|
# This 'worker' VM will not inherit "debian/jessie64".
# Instead, this VM will explicitly use "debian/stretch64"
worker.vm.box = "debian/stretch64"
end
end
最后::创建文件/some_platform/Vagrantfile
将其捆绑在一起:
# Load Sensible Defaults
sensible_defaults_vagrantfile = '/some_platform/DRY_vagrant/Vagrantfile.sensible'
load sensible_defaults_vagrantfile if File.exists?(sensible_defaults_vagrantfile)
# Define the 'api' VM within the main Vagrantfile
Vagrant.configure("2") do |config|
config.vm.define "api" do |api|
# This 'api' VM will automatically inherit the "debian/jessie64" which we
# configured in Vagrantfile.sensible
# Make customizations to the 'api' VM
api.vm.hostname = "vm-debian-jessie64-api"
end
end
# Load the 'worker' VM
worker_vm_vagrantfile = '/some_platform/DRY_vagrant/Vagrantfile.worker'
load worker_vm_vagrantfile if File.exists?(worker_vm_vagrantfile)
这种方法几乎可以用于任何其他vagrantfile配置选项。它不仅限于“ config.vm.box”设置。
希望这对您有帮助!