Избегание повторения в конфигурации supervisord для нескольких программ

Вопрос или проблема

Мне нужно запустить несколько экземпляров одного и того же приложения с немного различными настройками. Единственное, что меняется, это один параметр командной строки.

Итак, у меня есть скрипт, который выглядит примерно так:

[program:thing-one]
command=/usr/local/thing --instance one
user=a_user
stdout_logfile=/var/log/thing.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000

[program:thing-two]
command=/usr/local/thing --instance two
user=a_user
stdout_logfile=/var/log/thing.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000

[program:thing-three]
command=/usr/local/thing --instance three
user=a_user
stdout_logfile=/var/log/thing.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000

Как я могу избежать повторения одинаковых настроек?

Поскольку есть только три экземпляра одной и той же программы, которые различаются только одним аргументом, мы можем использовать развертывание строкового выражения Python внутри command, как указано ниже.

[program:things]
command=/usr/local/thing --instance %(process_num)s
numprocs=3
user=a_user
stdout_logfile=/var/log/thing.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000

По сравнению с вашей конфигурацией, я изменил две строки и добавил одну.

Кроме того, в документации сказано, что нужно включить данное расширение, если вы используете numprocs > 1.

Не думаю, что это именно то, что вы ищете, но в зависимости от ваших окончательных целей вы можете использовать скрипт для генерации конфигурации. Я системный администратор, а не разработчик, поэтому извиняюсь за плохие практики кодирования. Но это позволит вам просто добавить одну строку, чтобы добавить новое приложение. Если бы вы захотели изменить любое из существующих директив, вам также пришлось бы сделать это только один раз в одном месте и снова запустить скрипт.

#!/usr/bin/env python 

config = "/etc/supervisor/conf.d/my.conf"
f = open(config, 'w')

apps=[
  ('thing-one','one'),
  ('thing-two','two'),
  ('thing-three','three')
]

for name, instance in apps:
  line1 = "[program:%s]\n" % name
  line2 = "command=/usr/local/thing --instance %s\n" % instance
  line3 = "user=a_user\n"
  line4 = "stdout_logfile=/var/log/thing.log\n"
  line5 = "autostart=true\n"
  line6 = "autorestart=true\n"
  line7 = "startsecs=10\n"
  line8 = "redirect_stderr=true\n"
  line9 = "directory=/\n"
  line10 = "startretries=1000\n\n"

  f.writelines([line1, line2, line3, line4, line5, line6, line7, line8, line9, line10])

Используйте sed, чтобы редактировать их все одновременно.
sed -i -e 's/numprocs=3/numprocs=4/g' your_conf.conf

или если использовать vi shift+V+G, shift+:+g/numprocs=3/s//numprocs=4/g

Возможно, это не прямой ответ, но в управлении лучше держать каждый блок [program:] в отдельном файле thing-one.conf, thing-two.conf, thing-three.conf.

В случае, если вы захотите отключить один экземпляр, просто выполните mv thing-two.conf thing-two.conf_off или удалите его навсегда. Даже группировать схожие экземпляры легче, когда они находятся в отдельных файлах.

Это просто мой небольшой опыт.

Ответ или решение

Для решения задачи по минимизации повторений в конфигурационном файле Supervisord при запуске нескольких экземпляров одного и того же приложения, мы можем воспользоваться несколькими подходами. Это поможет снизить дублирование кода и упростить дальнейшее управление конфигурациями. Рассмотрим подробно возможность использования секции program с параметром numprocs, создания скрипта для генерации конфигураций, а также другие полезные методы.

Теория

Supervisord предоставляет встроенные возможности для оптимизации конфигураций. Параметр numprocs в конфигурации позволяет запустить несколько экземпляров программы с минимальными изменениями в коде. При этом за идентификацию каждого процесса отвечает переменная %(process_num)s, которая подставляется в командную строку программы. Этот метод позволяет сократить код, оставляя общие настройки неизменными.

Пример

Обратите внимание на следующую конфигурацию, которая демонстрирует использование numprocs:

[program:things]
command=/usr/local/thing --instance %(process_num)s
numprocs=3
user=a_user
stdout_logfile=/var/log/thing_%(process_num)s.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000

В этом примере параметр numprocs указывает на запуск трех экземпляров программы, причем каждый экземпляр получает уникальный номер через переменную %(process_num)s. Такой подход существенно сокращает дублирование конфигурации.

Применение

Для внедрения данного метода:

  1. Определите количество экземпляров, которые вам необходимо запустить, и укажите его в numprocs.
  2. Измените командную строку с учетом использования переменной %(process_num)s, чтобы каждый экземпляр процесса имел отличительные параметры.
  3. Поддерживайте уникальность лог-файлов. Это можно сделать путем добавления %(process_num)s в путь к лог-файлу, что упростит анализ логов каждого из процессов в отдельности.

Альтернативные методы

Скрипт для генерации конфигураций

Вы также можете использовать скрипт на Python для автоматической генерации конфигурационных файлов с уникальными настройками. Это становится особенно полезным, когда необходимо часто изменять параметры для нескольких процессов.

Пример скрипта:

#!/usr/bin/env python 

configs=[
  ('thing-one','one'),
  ('thing-two','two'),
  ('thing-three','three')
]

config_path = "/etc/supervisor/conf.d/my.conf"
with open(config_path, 'w') as f:
    for name, instance in configs:
        f.write(f"[program:{name}]\n")
        f.write(f"command=/usr/local/thing --instance {instance}\n")
        f.write("user=a_user\n")
        f.write(f"stdout_logfile=/var/log/{name}.log\n")
        f.write("autostart=true\n")
        f.write("autorestart=true\n")
        f.write("startsecs=10\n")
        f.write("redirect_stderr=true\n")
        f.write("directory=/\n")
        f.write("startretries=1000\n\n")

Этот скрипт гарантирует, что все измененные параметры будут применены сразу ко всем нужным секциям.

Управление с помощью утилит

Для массового редактирования конфигурационных файлов можно использовать команду sed. Это упрощает процесс одновременного изменения параметров во всех файлах.

sed -i -e 's/numprocs=3/numprocs=4/g' your_conf.conf

Заключение

Применение параметра numprocs, использование автоматизированных скриптов и командных утилит позволяют значительно упростить управление конфигурациями в Supervisord. Эти методы помогают избежать дублирования, улучшить читаемость и уменьшить вероятность ошибок при изменениях в настройках. Выбирайте подход, наиболее соответствующий вашим задачам и инфраструктуре.

Оцените материал
Добавить комментарий

Капча загружается...