【问题标题】:Supervisord - using A variable INSIDE the supervisord.confSupervisord - 在 supervisord.conf 中使用 A 变量
【发布时间】:2023-03-28 17:45:01
【问题描述】:

改用supervisod 作为过程控制系统。

我有一个 LONG 并在我的 supervisord.conf 中重复环境配置,为很多进程设置了很多环境变量。我需要在一个地方定义它并重用它,以保持配置干燥和可维护。主管可以做到吗?如何做?

编辑:非干式配置示例

[program:node-app1]
command=node /home/ubuntu/server/node-app1/app.js
directory=/home/ubuntu/server/node-app1
autostart=true
autorestart=true
stderr_logfile=/home/ubuntu/supervisor/node_app1/err.log
stdout_logfile=/home/ubuntu/supervisor/node_app1/out.log
user=ubuntu
priority=998
startretries=20
ENVIRONMENT=BROKER_URL="amqp://user:password@path.to.rabbit:5672",
            NODE_ENV=envName,
            MONGO_URL="mongodb://path.to.mongo:27017",
            BASE_PUBLIC_API="http:path.to.api",
            REDIS_URL="redis://path.to.redis:6379",
            BACKEND_URL="https://path.to.backend",
            CHARTS_URL="https://path.to.charts"

[program:node-app2]
command=node /home/ubuntu/server/node-app2/app.js
directory=/home/ubuntu/server/node-app2
autostart=true
autorestart=true
stderr_logfile=/home/ubuntu/supervisor/node_app2/err.log
stdout_logfile=/home/ubuntu/supervisor/node_app2/out.log
user=ubuntu
priority=20
startretries=20
ENVIRONMENT=BROKER_URL="amqp://user:password@path.to.rabbit:5672",
            NODE_ENV=envName,
            MONGO_URL="mongodb://path.to.mongo:27017",
            BASE_PUBLIC_API="http:path.to.api",
            REDIS_URL="redis://path.to.redis:6379",
            BACKEND_URL="https://path.to.backend",
            CHARTS_URL="https://path.to.charts"

可以共享的内容:ENVIRONMENT,日志的基本目录(每个应用程序只有结尾会改变),常用变量,如 startsecs。等等

【问题讨论】:

  • 不确定主管,但您尝试过PM2 吗?
  • 我知道下午2点。但是我们切换到主管是因为在使用另一个 node.js“扮演你自己的”过程控制系统在生产中出现奇怪且不可接受的故障之后,我们移动了如此经过实战证明的监督。因此问题
  • supervisord下所有进程在全局环境中设置重用变量是否有问题,能否提供2个子进程的非DRY配置示例?
  • @lossleader 添加了一个非 DRY 示例

标签: supervisord


【解决方案1】:

选项

通过supervisord的继承:

只要你使用version 3.0a10或以上,你可以在[supervisord] environment中设置环境变量,它们将在supervisord管理的所有进程的环境中。

[supervisord]
...
environment=FAVORITE_VENTURE="RUSTY",FAVORITE_COLOR="RED"

使用从 Shell 继承的变量 supervisord

Supervisord 还有一个%(ENV_VARNAME)s expansion format 用于解释环境变量,这将允许移动不同进程的变量名称。但是配置的 environment 部分不会添加到%(ENV_)s 机制可用的环境变量中,因此有必要使用您的 shell 已经设置的变量调用 supervisord。

例如,如果您使用 init 脚本启动 supervisord,并且在基于 debian 的系统(即 Ubuntu)上,那么您可以从 /etc/default/supervisor 中的以下内容开始:

export SUPERVISOR_INCLUDES="main.conf test.conf"
export MAIN_RETRY_COUNT=2
export TEST_RETY_COUNT=1
MONGO_BASE="MONGO_URL=mongodb://path.to.mongo"
MAIN_MONGO_URL="${MONGO_BASE}:27017"
TEST_MONGO_URL="${MONGO_BASE}:27018"
export MAIN_ENV="${MAIN_MONGO_URL},OTHER_THING=\"Another thing with escaped quoting\""
export TEST_ENV=..

然后在配置中使用它们:

; supvervisord.conf
[includes]
files= %(here)s/subdir/other.conf %(ENV_SUPERVISOR_INCLUDES)s 

; main.conf
[group:main]
...
[program:mainbackend]
startretries=%(ENV_MAIN_RETRY_COUNT)s
environment=%(ENV_MAIN_ENV)s

如果用户可以 sudo 并直接调用 supervisord,则此方法效果不佳,因为 sudo 既剥离了用户环境,又不运行传统的 shell 初始化脚本。但是您可以在 root 的 .bashrc 中 source /etc/default/supervisor 并使用 sudo bash -c "supervisord .." 或在调用 supervisord 之前获取它。

【讨论】:

  • 这是正确的方向(使用 supervisord 部分),但并不完全正确。 1. 我有一些常见的“组”,每个组的环境变量语法略有不同。因此,如果我可以在“组”中设置“环境”而不是在可以工作的 [supervisord] 部分中。那可能吗? 2. 这不能解决其他公共变量,它们不是“环境”,例如日志的公共基础目录,或者 startsecs、重启 attemptps 等的公共变量。关于那个有什么想法吗?
  • 听起来你会想要使用 %(ENV_)s 方法,这意味着确保在 supervisord 启动时变量已经存在。在类似 debian/ubuntu 的系统中,您可以在 /etc/default/supervisor 中创建并导出它们。对于任何系统,您应该能够将它们添加到普通的 rc 文件中,然后只要您使用 3.2+,它们就可以在整个配置中引用。
  • 您能否添加一个示例,如何使用 rc 文件和 ENV 在代码中的样子?是的,我使用的是 3.2
  • 我会接受答案,但这并不是我真正想要的
  • 谢谢,我认为如果你想在配置中重用变量,你最干净的选择是生成重复的配置,通过 [includes]-> 来自 DRY 模板的文件中的 glob 包含在任何自动构建+中部署您使用的系统。但有趣的是,动态配置的 supervisord 选项是如何进步的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 2012-07-15
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多