Supervisord - 在 supervisord.conf 中使用变量 INSIDE
Supervisord - using A variable INSIDE the supervisord.conf
改为使用 supervisod 作为过程控制系统。
我有一个 LONG 并在我的 supervisord.conf 中重复环境配置,为很多进程设置了很多环境变量。我需要在一个地方定义它并重用它,以保持配置 DRY 和可维护。这对主管来说可能吗?如何做?
编辑:非干燥配置示例
[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 等公共变量。等等
选项
通过从 supervisord 继承:
只要是version 3.0a10以上的,都可以在[supervisord] environment
中设置环境变量,它们会在supervisord管理的所有进程的环境中。
[supervisord]
...
environment=FAVORITE_VENTURE="RUSTY",FAVORITE_COLOR="RED"
使用从 Shell
继承的变量 supervisord
Supervisord 还有一个 %(ENV_VARNAME)s
expansion format 用于解释环境变量,这将允许为不同的进程移动变量名称。但是配置的环境部分不会添加到 %(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 之前获取它。
改为使用 supervisod 作为过程控制系统。
我有一个 LONG 并在我的 supervisord.conf 中重复环境配置,为很多进程设置了很多环境变量。我需要在一个地方定义它并重用它,以保持配置 DRY 和可维护。这对主管来说可能吗?如何做?
编辑:非干燥配置示例
[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 等公共变量。等等
选项
通过从 supervisord 继承:
只要是version 3.0a10以上的,都可以在[supervisord] environment
中设置环境变量,它们会在supervisord管理的所有进程的环境中。
[supervisord]
...
environment=FAVORITE_VENTURE="RUSTY",FAVORITE_COLOR="RED"
使用从 Shell
继承的变量 supervisordSupervisord 还有一个 %(ENV_VARNAME)s
expansion format 用于解释环境变量,这将允许为不同的进程移动变量名称。但是配置的环境部分不会添加到 %(ENV_)s
机制可用的环境变量中,因此有必要使用您的 shell.
例如,如果您使用 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 之前获取它。