Configuration 应用程序配置存储的良好实践?

Configuration 应用程序配置存储的良好实践?,configuration,distributed,Configuration,Distributed,我们有很多松散耦合的应用程序,有些是PHP,有些是Python 有一个集中的地方,在那里他们可以获得全局和特定于应用程序的配置信息,这将是有益的 例如,对于Python: conf=config\u server.get\u参数(url=)http://config_server/get/My_app/all,auth=my_auth_data) 然后理想地使用参数作为潜在的嵌套属性,例如conf.APP.URL,conf.GLOBAL.MAX_SALES 我正在考虑制作自己的配置服务器应用程序

我们有很多松散耦合的应用程序,有些是PHP,有些是Python

有一个集中的地方,在那里他们可以获得全局和特定于应用程序的配置信息,这将是有益的

例如,对于Python:

conf=config\u server.get\u参数(url=)http://config_server/get/My_app/all,auth=my_auth_data)

然后理想地使用参数作为潜在的嵌套属性,例如
conf.APP.URL
conf.GLOBAL.MAX_SALES

我正在考虑制作自己的配置服务器应用程序,但不确定这种方法的优缺点是什么,例如将配置存储在集中式数据库或任何其他多站点访问模式中


此外,如果我可能缺少一些现成的工具,这些工具有很好的支持,可以做到这一点(我看了Puppet和Ansible,但它们似乎是非常进化的工具,可以做更多的事情。我也看了软件重新编译SE,但它们已经有很多这样的问题没有答案).

我认为您的配置机制最好不要硬编码,通过特定技术(如文件、web服务器或数据库)获取配置数据,而是能够从几种不同技术中的任何一种获取配置数据。我用以下伪代码示例来说明这一点:

cfg = getConfig("file.cfg");                          # from a file
cfg = getConfig("file#file.cfg");                     # also from a file
cfg = getConfig("url#http://config_server/file.cfg"); # from the specified URL
cfg = getConfig("exec#getConfigFromDB.py");           # from stdout of command
传递给
getConfig()
的参数可以从命令行选项中获取。
“exec#…”
格式是一种灵活的机制,但会带来指定要执行的恶意命令的潜在危险,例如,
“exec#rm-rf/”

这种方法意味着你可以尝试任何你认为是配置数据技术的理想来源,然后,如果你发现技术是不合适的,那么丢弃它并使用不同的配置数据技术源将是微不足道的。实际上,使用哪种配置数据技术源的决定可能因用例/用户而异

我开发了一个C++和java配置文件解析器(对不起,没有Python或PHP实现)。如果您查看的第2章(语法概述)和第3章(API概述),您会注意到它支持我在本回答中讨论的灵活方法(不支持

“url”…
格式,但
“exec”curl-sS…
提供了相同的功能).99%的情况下,我最终会使用配置文件,但我感到欣慰的是,我的应用程序可以在需要时轻松地切换到使用不同的配置数据源技术