首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以从另一个Vagrantfile中加载Vagrantfile配置?

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

Stack Overflow用户
提问于 2017-09-28 03:13:08
回答 2查看 2.3K关注 0票数 7

迷茫的多机功能看起来很酷,但是困扰我的一件事(或者不是马上就能看到)是,在“父”Vagrantfile和“子”Vagrantfile之间似乎没有一个共享配置选项的好方法。是否有一种在父级和其子级之间有效和可维护地共享配置选项的方法?举个例子可以使这一点更加清楚。

假设我有一个平台,它由3个应用程序/服务组成: API、Web和Worker。

让我们假设以下目录结构:

代码语言:javascript
复制
/some_platform
  /api
    # app code...
    Vagrantfile
  /web
    # app code...
    Vagrantfile
  /worker
    # app code...
    Vagrantfile
  Vagrantfile

假设/some_platform/api/Vagrantfile看起来像:

代码语言:javascript
复制
Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
end

据推测,web和look看起来很相似。

现在,使用多台机器的奇妙之处,我依赖于Vagrant坐标这些VM,/some_platform/Vagrantfile看起来像:

代码语言:javascript
复制
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?”这样做为如何设置应用程序运行的服务器提供了一个单一的真相来源。我意识到有些提供程序是可以使用的(我也会使用它们),但是你仍然需要声明一些其他的东西,我想让它保持干燥,这样我就可以通过多台机器打开一组应用程序,或者我可以在一个应用程序上工作并更改它的VM/服务器设置。

我真正喜欢的是一种将其他Vagrantfiles合并成“父”文件的方法。

这有可能吗?还是我疯了?对于如何实现这一点,有什么聪明的想法吗?我用了一些yaml文件和POROs来解决这个问题,但是没有一个黑客感到非常满意。

EN

回答 2

Stack Overflow用户

发布于 2018-11-26 23:58:16

好消息!

实际上,您可以在Vagrantfile文件中应用干原理

First:创建一个文件/some_platform/DRY_vagrant/Vagrantfile.sensible以保存一些合理的默认值:

代码语言:javascript
复制
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

第二步:为'worker‘虚拟机创建一个文件/some_platform/DRY_vagrant/Vagrantfile.worker

代码语言:javascript
复制
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,将其连接在一起:

代码语言:javascript
复制
# 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)

这种方法几乎可以用于任何其他的迷走文件配置选项。它不仅限于"config.vm.box“设置。

希望这能帮上忙!

票数 9
EN

Stack Overflow用户

发布于 2017-09-29 14:33:58

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

  1. 看看如何使用Ruby模板Vagrantfile? --它是一个示例--如何读取另一个文件的内容,Vagrantfile只是一个ruby脚本,因此您可以使用ruby的所有功能。
  2. 迷航器有一个加载和合并的概念,请参阅从医生那里,因此如果您想在任何时候运行命令,您可以在~/.vagrant.d/文件夹下创建一个Vagrantfile,并且它将始终运行。

一个缺点(或者至少要注意):Vagrantfile是一个ruby脚本,它被计算为--每个(和每次)--一个流浪者命令被执行(向上,状态,停止.)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46460383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档