супервайзер/сельдерей/python — «динамические» переменные среды — «глобальные» по сравнению с «локальными» — СУХИЕ

#python-3.x #django #celery #supervisord

Вопрос:

Давайте представим, что у меня есть следующий основной файл /etc/supervisord.conf (пожалуйста, обратите внимание, что для экранирования %s требуется дважды DYNAMIC_VAR ):

 [unix_http_server]
file                             = /tmp/supervisor.sock
[supervisord]
<snip>
environment                      = STATIC_VAR="foo",
                                   DYNAMIC_VAR="bar_%%s_%%s"

[include]
files                            = /etc/supervisord.d/worker1.conf
                                   /etc/supervisord.d/worker2.conf
 

Файлы worker1 и 2:

 [program:worker1]
environment                      = WORKER_1_VAR_1"toto",
                                   WORKER_1_VAR_2="toto_too"
 
 [program:worker2]
environment                      = WORKER_2_VAR_1"toto",
                                   WORKER_2_VAR_2="toto_too"
 

(пропуская другое содержимое файла, поскольку оно не имеет отношения к делу)

Моя версия супервайзера-3.4.0 на Centos 7.9. Это выполняется в virtualenv на задней панели Python 3.9.0

ОСНОВНАЯ ЦЕЛЬ: Где-то в коде, выполняемом одним из работников, произойдет что-то подобное («%%s», превращенное в «%s», будет заменено динамическим значением):

 from django.conf import settings
final_value = settings.DYNAMIC_VAR % (
    'replacement_string_of_some_kind',
    'another string'
)
 

Что происходит, так это то, что вышеизложенное всегда приводит к ошибке при запуске супервизора:

 Error: Format string <snip> for 'supervisord.environment' is badly formatted: not enough arguments for format string
 

ОДНАКО, если я удалю supervisord.environment раздел из основного файла конфигурации и скопирую его содержимое в отдельные рабочие файлы, запуск произойдет нормально.

Например:

 [program:worker1]
environment                      = STATIC_VAR="foo",
                                   DYNAMIC_VAR="bar_%%s_%%s",
                                   WORKER_1_VAR_1"toto",
                                   WORKER_1_VAR_2="toto_too"
 

Я делаю что-то не так? Происходит ли какой-то «двойной разбор» при запуске? Можно ли вообще заставить это работать.

Спрашиваю, потому что мой список «глобальных переменных env» довольно длинный, как и мой список работников/программ. Я, очевидно, хотел бы объявить переменные env глобальными для всех работников один раз, а не один раз для каждого работника, поэтому стараюсь сохранить их СУХИМИ…

Идеи приветствуются!