gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:16:22 24 4
gpt4 key购买 nike

Vagrant Multi-Machine 功能看起来很酷,但是困扰我的一件事(或者不是立即明显的)是,似乎没有一种好的方法可以在“父”Vagrantfile 和“ child ”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 协调这些虚拟机,/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- 启动一组应用程序机器,或者我可以处理单个应用程序并更改其虚拟机/服务器设置。

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

这可能吗?或者我疯狂地尝试?关于如何实现这一目标有什么聪明的想法吗?我已经用一些 yaml 文件和 PORO 来解决这个问题,但没有一个 hack 让人感到非常满意。

最佳答案

好消息!
您实际上可以申请 DRY principles在 Vagrantfile 中。

首先:创建一个文件/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)

这种方法几乎可以用于任何其他 vagrantfile 配置选项。它不仅限于“config.vm.box”设置。

希望这有帮助!

关于vagrant - 是否可以从另一个 Vagrantfile 中加载 Vagrantfile 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46460383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com