迷茫的多机功能看起来很酷,但是困扰我的一件事(或者不是马上就能看到)是,在“父”Vagrantfile和“子”Vagrantfile之间似乎没有一个共享配置选项的好方法。是否有一种在父级和其子级之间有效和可维护地共享配置选项的方法?举个例子可以使这一点更加清楚。
假设我有一个平台,它由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据推测,web和look看起来很相似。
现在,使用多台机器的奇妙之处,我依赖于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?”这样做为如何设置应用程序运行的服务器提供了一个单一的真相来源。我意识到有些提供程序是可以使用的(我也会使用它们),但是你仍然需要声明一些其他的东西,我想让它保持干燥,这样我就可以通过多台机器打开一组应用程序,或者我可以在一个应用程序上工作并更改它的VM/服务器设置。
我真正喜欢的是一种将其他Vagrantfiles合并成“父”文件的方法。
这有可能吗?还是我疯了?对于如何实现这一点,有什么聪明的想法吗?我用了一些yaml文件和POROs来解决这个问题,但是没有一个黑客感到非常满意。
发布于 2018-11-26 23:58:16
好消息!
实际上,您可以在Vagrantfile文件中应用干原理。
First:创建一个文件/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第二步:为'worker‘虚拟机创建一个文件/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)这种方法几乎可以用于任何其他的迷走文件配置选项。它不仅限于"config.vm.box“设置。
希望这能帮上忙!
发布于 2017-09-29 14:33:58
有两件事你可以看(可能更多,但这两件事在我的脑海中出现)
~/.vagrant.d/文件夹下创建一个Vagrantfile,并且它将始终运行。一个缺点(或者至少要注意):Vagrantfile是一个ruby脚本,它被计算为--每个(和每次)--一个流浪者命令被执行(向上,状态,停止.)
https://stackoverflow.com/questions/46460383
复制相似问题