Вопрос или проблема
Мы управляем довольно большим количеством linux-серверов с использованием ansible через сервер AWX и обновляем их раз в неделю с помощью dnf update. Большинство наших серверов работают под управлением Alma Linux.
Недавно у нас было два случая, когда были выпущены значительные ошибки, что вызвало множество проблем и потребовало много работы для их устранения. Я думаю о каком-то механизме, который позволит устанавливать обновления/пакеты только на основе указанного минимального возраста или времени с момента выпуска. Например, мы запускаем dnf update, но устанавливаем только то, что выпущено как минимум две недели назад (таким образом, надеясь избежать любых новых проблем, которые могут возникнуть).
Я обыскал интернет и не нашел ничего подобного, что удивительно. У кого-то есть способ сделать что-то подобное? Понимаю, что вопрос довольно открытый, но это потому, что я пока не могу найти даже отправной точки.
Для справки, вот фрагмент плейбука для обновления этих машин.
---
- name: upgrade all packages
remote_user: "{{ remote_user }}"
become: yes
dnf:
name: "*"
state: latest
Возможно, это может быть связано с --best
параметром dnf
.
-b, --best
Пробовать лучшие доступные версии пакетов в транзакциях. В частности, во время обновления dnf, которое по умолчанию пропускает обновления, которые не могут быть установлены из-за проблем с зависимостями, этот переключатель заставляет DNF учитывать только последние пакеты. Если встречаются пакеты с нарушенными зависимостями, DNF выдаст ошибку, объясняющую, почему последняя версия не может быть установлена.
Отметим, что использование самой новой доступной версии гарантируется только для пакетов, запрошенных напрямую (например, в виде аргументов командной строки), а решатель может использовать более старые версии зависимостей для удовлетворения их требований.
В dnf
модуле Ansible есть параметр nobest
.
Единственный способ — это “скачать только” пакет на всех серверах в течение дня…
А затем “установить только” позже для каждой среды: тест, разработка, квалификация, предпроизводство, производство…
.
Ответ или решение
Теория:
В администрировании серверов на основе Linux, таких как Alma Linux, регулярное обновление пакетов является критически важным для поддержания безопасности и функциональности системы. Однако, как показывает практика, быстрые обновления могут вводить критические ошибки, которые трудно предсказать. Поэтому организация процессов обновления с учетом времени "выдержки" пакетов на рынке может помочь избежать потенциальных проблем и снизить риск неисправностей. Основная идея здесь заключается в создании механизма, который позволит устанавливать только те обновления, которые находятся в стабильном состоянии на протяжении определенного времени, например, двух недель.
Пример:
Вы уже используете Ansible и AWX для управления вашими серверами. Однако текущий подход with dnf update устанавливает все последние версии пакетов без рассмотрения их устойчивости во времени. Для решения вашей проблемы можно предложить подход, основанный на предварительной проверке пакетов перед обновлением в production-среде.
-
Внедрение этапа "скачивания только": Используйте DNF для загрузки пакетов без их непосредственной установки. Это можно сделать с помощью команды
dnf download
, которая позволит вам загрузить все пакеты на серверы. -
Создание тестовой среды: После загрузки пакетов, установите их в тестовой среде. Ваша команда может протестировать обновления на наличие ошибок и определить их стабильность.
-
Время выдержки: Через две недели после выхода обновления, если пакеты в тестовой среде не вызвали проблем, они могут быть установлены на продуктивных серверах.
-
Автоматизация процесса: Используйте Ansible Playbooks для автоматизации каждой стадии процесса — от загрузки до установки. Вы можете настроить сценарии с переменными и условиями, чтобы проверить дату выпуска пакетов перед их установкой.
Применение:
Чтобы выполнить эти шаги используя Ansible, предлагается внедрить следующие механизмы:
-
Скачивание пакетов:
Модифицируйте ваш Ansible Playbook, чтобы использовать
dnf download
:- name: скачивание всех пакетов remote_user: "{{ remote_user }}" become: yes command: dnf download --resolve '*' -y
Этот плейбук будет скачивать все последние версии пакетов на сервер, без их установки.
-
Тестовое окружение и временной лаг:
Настройте тестовые серверы, где пакеты будут установлены вручную после загрузки. Создайте дополнительные плейбуки, которые будут выполнять установку с учетом временного лага. Вы можете использовать предварительно заготовленные метаданные пакетов или третий софт для проверки даты выпуска.
-
Установка на продуктивных серверах:
После успешного тестирования и проверки срока выдержки, создайте плейбук для установки пакетов в продуктивной среде:
- name: установка всех пакетов remote_user: "{{ remote_user }}" become: yes dnf: name: "*" state: latest disable_excludes: all
-
Проверка и мониторинг:
Разработайте скрипты и плейбуки для мониторинга установленных версий пакетов и возможных ошибок после установки. Интеграция решений на основе Prometheus или Zabbix поможет в автоматизации этих процессов.
Заключение:
Хотя текущая версия DNF и Ansible не предоставляют прямой возможности управления обновлением пакетов на основе даты выпуска, описанный выше подход позволяет реализовать подобное поведение в рамках интеграции существующих средств. Этот процесс может потребовать некоторых затрат времени на организацию среды и создание необходимых скриптов, однако в долгосрочной перспективе поможет снизить риски и повысить устойчивость серверных решений к неожиданным ошибкам обновлений.