Описанный ранее вариант развёртывания сервера 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
Здесь, как минимум, мы не должны получить никаких явных ошибок выполнения.
Теперь можно попробовать на любом клиенте Patchman выполнить команду отправки отчёта на сервер Patchman, выполнив команду "patchman-client -v" или просто запустив ранее настроенную службу "patchman-client-report.service". В момент отправки клиентского отчёта в запущенном ранее сеансе Celery должны появиться события получения и успешной обработки отчёта:
При этом информация в веб-консоли сервера 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
Добавить комментарий