【问题标题】:Configuration Promotion Between Environments环境间配置提升
【发布时间】:2023-03-31 08:31:02
【问题描述】:

通过环境协调配置更改的好方法是什么?

为了将我们的代码与环境分离,我们已将所有环境配置移至外部文件。所以也许应用程序会寻找 ${application.config.dir}/app.propertiesapp.properties 可能包含:

user.auth.endpoint=http://some.url/user
user.auth.apikey=abcd12314

问题是,user.auth.endpoint 在测试时需要指向测试资源,在暂存环境中需要指向暂存资源,在生产时需要指向生产资源。

我们可以维护配置文件的不同副本,但这会违反 DRY 并变得非常笨重(有 20 多个生产环境)。

有什么好的方法来管理这个?我应该搜索什么工具?

【问题讨论】:

    标签: configuration configuration-files environment configuration-management


    【解决方案1】:

    外部化配置是个好主意,您可以将它们一直外部化到环境变量。

    环境变量很容易在部署之间更改,而无需更改任何代码; 与配置文件不同,它们被检入的可能性很小 代码仓库意外;与自定义配置文件或其他 配置机制,例如 Java System Properties,它们是一种语言- 和操作系统无关的标准。

    来自http://12factor.net/config

    【讨论】:

    • 优秀的链接!我不反对使用环境变量,但我仍然在同一条船上;在本地我有export SOME_CONFIG=/location/of/resource,每个环境都不同。我如何将其提升到生产中,而不必依赖于告诉某人并冒着他们错误输入环境变量的风险?
    • 我猜你正在寻找类似于我工作的产品的东西:thoughtworks-studios.com/docs/go/current/help/… 但我不知道除了 memcached 之外的独立解决方案。
    【解决方案2】:

    我知道这三种方法。

    第一种方法是为您的应用程序编写一个 Python“包装器”脚本。该脚本会找出一些环境细节,例如主机名、用户名和环境变量的值,然后构造适当的配置文件(或一组命令行选项)并传递给实际应用程序。

    第二种方法是在您的应用程序中嵌入脚本语言的解释器(想到 Python、Lua 和 Tcl)。这使您可以使用该嵌入式脚本语言的语法编写配置文件。通过这种方式,配置文件可以利用脚本语言的特性,例如查询环境变量或执行 shell 命令(如hostname)和使用 if-then-else 语句来适当地设置变量的能力。

    第三种方法(如果您使用 C++ 或 Java)是使用开源 Config4* 库(免责声明,我是该库的主要开发者)。我建议您阅读“Config4* 入门”手册的第 2 章,了解其灵活的语法如何使单个配置文件适应多种环境的示例。

    【讨论】:

      【解决方案3】:

      你可以看看http://www.configapp.com。您使用 1 个配置文件,并在环境之间切换/选项卡。在内部它只是 1 个配置文件,它处理环境变量并为特定环境生成配置文件。在配置术语中,您有 1 个具有 20 多个实例的 Prod 环境。您将拥有一个 Prod 环境配置,并且可以使用 Web 界面相应地调整 20 多个实例。

      您将特定于环境的属性移动到单独的文件中,但使用 Config,您不必这样做。使用 Config,您可以拥有 1 个配置文件,支持环境变量,并将通用配置应用于所有环境。

      请注意,我是 Config 团队的一员。

      【讨论】:

        猜你喜欢
        • 2019-07-04
        • 1970-01-01
        • 2015-12-13
        • 2023-04-10
        • 2015-07-15
        • 2011-03-15
        • 2020-01-29
        • 2019-07-21
        • 2013-02-22
        相关资源
        最近更新 更多