【问题标题】:Best practices for managing multiple environment variables in prodution在生产中管理多个环境变量的最佳实践
【发布时间】:2020-07-23 04:15:04
【问题描述】:

虽然我不熟悉 DevOps 最佳实践,但我正在尝试提出一种可靠且高效的方法来管理生产中的多个变量。以下代表我目前的做法:

/
|ENV_VAR.sh
|--/api1
|--/staging.api1
|--/api2
|--/staging.api2

地点:

ENV_VAR.sh

### API 1 variables ###
export API1_VAR_1=foo
export API1_VAR_2=foo2
export API1_STAG_VAR_1=foo_stag
export API1_VAR_2=foo2_stag2

### API 2 variables ###
export API2_VAR_1=foo
export API2_VAR_2=foo2
export API2_STAG_VAR_1=foo_stag
export API2_VAR_2=foo2_stag2

API 1 和 2 是两个基于 nodejs 的应用程序,使用反向代理配置在同一台服务器上运行。 如果服务器没有任何问题(例如意外关闭),我只需要不时通过SOURCE ENV_VAR.SH(重新)设置变量,以确保定义了新变量。

在继续这种方法之前,我想知道它是否完全正确,或者它是否有很大的缺陷。 如果这种方法没问题,那么每当部署任何应用程序的新版本时,如何自动(重新)从package.json 获取环境变量? (只是为了保证变量仍然被定义)

提前致谢。

【问题讨论】:

  • 下午。这是一个有点宽泛的问题,您目前如何部署到您的生产和登台环境?
  • 我目前正在使用为每个环境配置的yml 文件,然后通过 GitLab 进行处理。更新相应的分支后,将创建一个新管道并将其复制到服务器的应用程序。然后我通过pm2 包访问服务器并启动/管理应用程序。

标签: node.js environment-variables devops production-environment node-config


【解决方案1】:

我喜欢将 Loren West 的 config 包用于这些配置参数。我碰巧喜欢用properties 包对其进行扩展:这样我就不必将参数设置为有效的、无注释的JSON 格式。 JSON5也有助于解决可读性问题,但我没试过。

我为什么喜欢这个?

  1. 它提供了一种结构化的方式来处理开发/测试/暂存/生产环境。它关闭了ENV 环境变量,它当然具有developmentproduction 之类的值。

  2. 所有属性文件都进入一个目录,通常是./config。你的生产克鲁可以告诉他们在看什么。 default.propertiesdevelopment.propertiesproduction.properties是典型文件的名称。

  3. 大多数配置参数不必保密,因此可以将它们提交到您的存储库。

  4. 秘密(密码、连接字符串、API 密钥等)可以存储在由您的部署系统放入 ./configlocal.properties 文件中。 (在您的 .gitignore 文件中提及 local.properties。)

  5. 秘密也可以从环境变量中加载,在一个名为./config/custom_environment_variables.json的文件中命名。

  6. 它与pm2 配合得很好。

这真的很容易配置。

您的文件:

 default.properties   (used when not overridden by another file)
 [API1]
 VAR_1 = foo
 VAR_2 = foo2
 [API2]
 VAR_1 = foo
 VAR_2 = foo_for_api2

 staging.properties
 [API1]
 VAR_1 = foo_stag
 VAR_2 = foo2_stag2
 [API2]
 VAR_1=foo_stag
 VAR_2=foo2_stag2

 custom_environment_variables.json
 {
   "API1" : {
     "password": "API1_PASS"
   },
   "API2" : {
     "password": "API2_PASS"
   }
}

你的 nodejs 程序:

const config = require( 'config' )
require( 'properties' )
const appConfig = config.get( 'API1' )

const var1 = appConfig.VAR_1
const password = appConfig.password

然后你用API1_PASS=yaddablah nodejs program.js 运行你的程序,你就会得到所有的配置。

【讨论】:

  • 感谢您的快速回复。我想我误解了什么。由于custom_environment_variables.jsonstaging.propertiesdefault.properties 都用于这两个 api,它们将位于何处? P.S.:每个 api 都有自己的 nodejs 实例并行运行并通过pm2 管理。
  • 对于两个 api 的情况,您有几个选择。一种是为每个人维护一个单独的配置目录。这仍然是一个改进,因为您的大多数配置都不是秘密的。第二种选择是为您的配置目录保留一个单独的 git 存储库,并将其作为 git 子模块加载到您的两个项目的存储库中。 git-scm.com/book/en/v2/Git-Tools-Submodules我敢打赌,你的 devops krewe 会喜欢第二个选择。
猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 2021-11-04
  • 2011-09-28
  • 1970-01-01
  • 2016-02-11
  • 2022-01-14
  • 1970-01-01
  • 2021-05-05
相关资源
最近更新 更多