在 12 要素应用程序中管理配置
Posted
技术标签:
【中文标题】在 12 要素应用程序中管理配置【英文标题】:Managing config in 12-factor applications 【发布时间】:2012-07-05 07:59:32 【问题描述】:我很喜欢在 Heroku 上使用 Rails,因此我可以调整 Heroku 应用程序的配置属性,而无需对 xyz.yml
进行更改并重新部署。
在我的 Rails 应用程序中完全取消 Yaml 配置文件并尽可能依赖将配置存储在 ENV 中会很好。这符合12-factor config 原则。
但是,从基于 Yaml 的配置管理切换到基于 Heroku/12 因子的配置管理时,需要权衡取舍。
虽然部署(qa、stage、prod、dev、demo、labs)的扩散确实会导致 Yaml 文件的扩散,但复制粘贴来创建新的配置文件非常容易。我看不到在 Heroku 中将配置文件从一个部署“复制”到另一个部署的方法。 在存储库中存储配置数据意味着,在 Heroku 的情况下,部署、配置和应用程序在一个操作中完成。如果我要将配置从 Yaml 文件中移到 ENV 变量中,我必须在部署后在单独的步骤中配置我的应用程序。想听听在他们的私有应用程序中使用 12 因素样式配置的人的意见,以及他们如何跨大量部署管理大量配置变量。
如何快速配置新部署? 如果不是存储库,您将配置变量的权威来源保存在哪里?您如何在开发者之间分发它?谢谢!
【问题讨论】:
【参考方案1】:答案有点晚,但我相信这就是你要找的。p>
我开发了一个名为 settei 的 gem,允许您使用 YAML 文件来配置应用程序。然而,gem 会在部署期间将 YAML 文件序列化为 one 环境变量。这样一来,两全其美:YAML 便于管理/创建衍生环境,ENV 12 因素合规性。
【讨论】:
【参考方案2】:您可以使用一些简单的 shell 脚本相对容易地完成此操作,通过 heroku config 或 heroku release:info v99 迭代现有变量,然后设置 heroku config:set k=v --app
但如果它是一个问题/痛苦/摩擦,也许你的 env var 配置中有太多内容。
【讨论】:
我不使用 Heroku,但我认为 12 因子可以应用于任何 SaaS 应用程序。我可以创建一个自定义 shell 脚本来在我的环境中创建该配置。但是,在这个背景之后,我的问题是:让我的配置变量(如数据库访问数据)成为环境变量没有安全问题?【参考方案3】:我通常使用的是使用 ENV 并提供默认值的 Yaml。例如,可以愉快地对 YAML 进行 ERB 处理以包含您的 ENV 变量:
foo:
var: ENV["MY_CONFIG"] || "default_value"
您只需要确保在阅读时使用 ERB 加载 Yaml:
YAML.load(ERB.new(File.read("#Rails.root/config/app_config.yml")).result)
通过这样做,您的代码可以在 dev 中正常工作,但也允许您在环境中设置配置变量。
【讨论】:
以上是关于在 12 要素应用程序中管理配置的主要内容,如果未能解决你的问题,请参考以下文章