是否可以从另一个Vagrantfile中加载Vagrantfile配置?

时间:2017-09-28 03:13:08

标签: vagrant vagrantfile

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来解决这个问题,但没有一个黑客感到非常满意。

2 个答案:

答案 0 :(得分:1)

你可以看两件事(可能更多,但这两件事在我脑海中浮现)

  1. How to template Vagrantfile using Ruby?为例,看看如何阅读另一个文件的内容,Vagrantfile只是一个ruby脚本,所以你可以使用ruby的所有功能。

  2. vagrant有加载和合并的概念,请参阅from doc所以如果你想做任何时候你运行一个vagrant命令,你可以在你的{下面创建一个Vagrantfile {1}}文件夹,它将始终运行

  3. 一个缺点(或至少要注意):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”设置。

希望这对您有帮助!