虽然我的理解是在不同的部署环境中使用环境变量配置应用程序是最佳实践,但我不知道管理这些环境并在其中填充变量的好方法。
以下是我正在考虑的方法:
-
在我们用来运行应用程序的Upstart脚本中填充它们。我们使用Ansible来提供我们的服务器,它目前复制一个静态的Upstart脚本,但是这可以用环境变量模板化。
-
相同的方法,但
/etc/environment
-
使用
envdir
之类的东西并再次使用ansible填充文件
另一个问题是在哪里存储值,我认为redis,但我愿意接受建议。Ansible有一个"Vault",我还没有考虑,这可能是一个选择。
值是API键和数据库url之类的东西。
我真的很想知道其他人用什么方法。我愿意接受所有的建议。
我认为这个问题会征求很多意见,可能会有很多相互矛盾的意见,但话虽如此,这里是我的一些意见:
-
/etc/environment
是操作系统的一部分,用于配置交互式用户shell。不要在应用程序中使用它。 通过ansible模板化的upstart配置对我来说似乎很合理。只要确保文件系统权限适当地锁定为root只读,如果您打算在那里存储敏感数据。 - 您也可以使用模板化的特定于应用程序的配置文件,例如
/etc/myapp/config
,它已经为许多程序工作了几十年。环境变量优于配置文件的观点实际上更多地来自于PaaS的角度(我认为heroku通过他们的12要素应用程序站点推广了这种方法)。因此,如果您的部署是PaaS或PaaS风格,则环境很方便。但如果你是通过Ansible在自己的服务器上安装应用,我认为直接配置文件更容易排除故障,原因我在我的博客文章中概述了环境变量被认为是有害的