Patchman и проблема обработки клиентских отчётов

Patchman and the problem of processing client reportsОписанный ранее вариант развёртывания сервера Patchman предполагал регулярную автоматическую обработку клиентских отчётов, которая в нашем примере выполнялась на стороне сервера раз в сутки по утрам. Однако с обновлением сервера Patchman до версии 3.0.13 (а может и раньше, так как обновились мы с версии 3.0.10) что-то изменилось в поведении работы сервера и процесс, запускаемый через настроенную нами службу systemd "patchman-server-reports.service" перестал обрабатывать последнюю порцию клиентских отчётов. То есть службой обрабатывались все клиентские отчёты за исключением тех, что были присланы на сервер за последние сутки.

В ходе обсуждения проблемы с автором проекта, была проверена гипотеза с влиянием механизма кеширования memcached. Для этого в конфигурационном файле /etc/patchman/local_settings.py было заменено содержимое параметра CACHES:

...
## Enable memcached
#CACHES = {
#    'default': {
#        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
#        'LOCATION': '127.0.0.1:11211',
#        'OPTIONS': {
#            'ignore_exc': True,
#        },
#    }
#}
#
#
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}

Однако, это повлияло на ситуацию не совсем таким образом, как хотелось бы. После отключения кеширования при ручном интерактивном выполнении команды "patchman --all" в консоли сервера все клиентские отчёты стали обрабатываться успешно, но когда эта же самая команда выполнялась по расписанию в фоновом режиме при запуске службы "patchman-server-reports.service" странность с обработкой всех клиентских отчётов за исключением сегодняшних снова себя проявила.

В качестве варианта решения этой проблемы возникла идея попробовать python-модуль Сelery в связке с Redis, как об этом в трёх словах упомянуто в инструкции по установке Patchman. Смысл в том, что с помощью этой связки на сервере Patchman образуется специальная очередь, которая в автоматическом режиме обрабатывает все приходящие от клиентов отчёты и это позволяет всегда иметь в веб-интерфейсе сервера Patchman актуальную информацию об установленных на клиентах пакетах.

Для начала установим на сервер Patchman на базе Debian 12 необходимые пакеты:

# apt-get install python3-celery redis python3-redis python-celery-common

Отредактируем основной конфигурационный файл сервера Patchman:

# nano /etc/patchman/local_settings.py

Добавим параметр активации обработки очереди с помощью Celery:

...
# Celery for realtime processing of reports from clients
USE_ASYNC_PROCESSING = True
...

Перезапустим службу веб-сервера:

# systemctl restart apache2.service

Попробуем запустить обработчик очереди так, как это показано в инструкции:

# C_FORCE_ROOT=1 celery -b redis://127.0.0.1:6379/0 -A patchman worker -l INFO -E

Launching a celery worker for the report processing queue in patchman

Здесь, как минимум, мы не должны получить никаких явных ошибок выполнения.

Теперь можно попробовать на любом клиенте Patchman выполнить команду отправки отчёта на сервер Patchman, выполнив команду "patchman-client -v" или просто запустив ранее настроенную службу "patchman-client-report.service". В момент отправки клиентского отчёта в запущенном ранее сеансе Celery должны появиться события получения и успешной обработки отчёта:

Receiving and successfully processing a client patchman report in a celery worker

При этом информация в веб-консоли сервера Patchman о хосте, отправившем отчёт сразу обновиться.

Таким образом мы проверили ручной запуск Celery и теперь нам нужно автоматизировать его запуск в фоновом режиме при загрузке сервера. Это можно реализовать разными способами, а мы попробуем сделать это с помощью systemd. Примеры подобной конфигурации можно найти в документе "Celery Daemonization". Создадим более простой файл конфигурации для новой службы с именем, например, "patchman-server-celery.service":

# nano /etc/systemd/system/patchman-server-celery.service

Наполним файл содержимым:

[Unit]
Description=Celery worker for realtime processing of reports from patchman clients
After=redis-server.service
Requires=redis-server.service

[Service]
Type=simple
ExecStart=/usr/bin/celery -b redis://127.0.0.1:6379/0 -A patchman worker -l INFO -E

[Install]
WantedBy=multi-user.target

Перезагрузим конфигурацию systemd, запустим службу и проверим её статус:

# systemctl daemon-reload
# systemctl enable patchman-server-celery.service
# systemctl start patchman-server-celery.service
# systemctl status patchman-server-celery.service

Дополнительно можно в реальном режиме времени отслеживать лог обработки очереди отчётом, приходящих на сервера от клиентов Patchman:

# journalctl -f -u patchman-server-celery.service

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