Vagrant的多机功能看起来非常酷,但有一件事让我困扰(或者并不明显),那就是似乎没有很好的方法在“父”Vagrantfile和“子”Vagrantfiles之间共享配置选项。是否有一种有效且可维护的方法在父级和其子级之间共享配置选项?例如可以更清晰地说明这一点。
假设我有一个平台,由3个应用程序/服务组成:API、Web和Worker。
假设目录结构如下:
我知道这个例子是编造的,但很容易看出,一旦你有了越来越复杂的配置声明,将其在两个地方重复会很烦人且有危险性。
你可能会想:“为什么每个项目都有自己的Vagrantfile?”这样做提供了一个统一的真相来源,告诉你该如何设置运行应用程序的服务器。我知道有一些 provisioners 可以使用(我会使用它们),但你仍然需要在外部声明其他一些内容,而我希望保持DRY,这样我可以通过 Multi-Machine 来启动一组应用程序集群,或者我可以工作于单个应用程序并更改其VM/服务器设置。
我真正想要的是一种将其他 Vagrantfiles 合并到“父”文件中的方法。
是否可能?还是我因尝试而变得疯狂?有没有聪明的想法来实现这一点?我已经在一些yaml文件和POROs上进行了尝试来避免这个问题,但是这些hack都不太令人满意。
假设我有一个平台,由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 协调这些虚拟机,/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?”这样做提供了一个统一的真相来源,告诉你该如何设置运行应用程序的服务器。我知道有一些 provisioners 可以使用(我会使用它们),但你仍然需要在外部声明其他一些内容,而我希望保持DRY,这样我可以通过 Multi-Machine 来启动一组应用程序集群,或者我可以工作于单个应用程序并更改其VM/服务器设置。
我真正想要的是一种将其他 Vagrantfiles 合并到“父”文件中的方法。
是否可能?还是我因尝试而变得疯狂?有没有聪明的想法来实现这一点?我已经在一些yaml文件和POROs上进行了尝试来避免这个问题,但是这些hack都不太令人满意。
/some_platform/Vagrantfile
有一个变量,而/some_platform/DRY_vagrant/Vagrantfile.sensible
需要它,你会如何将其传递给后者?使用全局变量吗...? - Dave MackeyVagrantfile.sensible
之前在Vagrantfile
中定义的所有变量都可以在Vagrantfile.sensible
中访问。@DaveMackey - Miron Veryanskiy