Короткий ответ

Нет шага отката — нет допуска к прод-изменению. Rollback plan — конкретные действия: что вернуть, откуда, за сколько, кто жмёт, какой критерий «откат успешен». Не фраза «есть backup». Для конфигов — копия файла/экспорт до правки. Для VM — проверенная точка backup или снимок с пониманием риска. Для AD/GPO — штатный backup GPO, не надежда на память.

Владелец изменения (Иван Петров или исполнитель в заявке) подписывает откат в CHG до начала окна.

Симптомы и как отличить

Типичная картина:

  • обновили Ubuntu, ядро не грузится, старого ядра в меню нет;
  • nftables перезаписали, бэкапа ruleset нет;
  • GPO затёрли, Backup-GPO не делали;
  • миграция VLAN, схема as-was не сохранена.

Отличия:

СитуацияНе «нет rollback»Куда
Нет вообще заявокрегламент измененийрегламент
Backup прод не настроенрегламент backupbackup
DRP на площадкукатастрофаDRP
Restore никогда не пробовалитестыrestore-тесты

Возможные причины

  1. Спешка: «правка на минуту».
  2. Не знают штатный способ отката патча.
  3. Снимок считают панацеей и применяют на DC.
  4. Конфиг правили в GUI, экспорт не сделали.
  5. Успешные изменения без отката приучили к безнаказанности.
  6. Редко: вендор заявил «отката нет» — тогда изменение нельзя делать без пилота.

Диагностика

Разберите последние неудачные работы. Вопросы к каждой:

  1. Была ли копия конфига с датой до изменения?
  2. Была ли точка backup проверенная, не «job зелёный»?
  3. Знали ли командор отката (не только исполнитель)?
  4. Сколько времени занял фактический возврат vs обещанное окно?

Проверьте, есть ли свежий backup узла, который собираетесь патчить:

# System Restore на Windows Server обычно не план отката. Смотрите штатный backup:
wbadmin get versions
# если целевой репозиторий известен:
wbadmin get versions -backupTarget:\\backup.contoso.example\Repo01

Linux:

sudo etckeeper vcs log -1   # если etckeeper внедрён
sudo cp -a /etc/nftables.conf /root/nftables.conf.$(date +%F)
ls /boot/vmlinuz-*

Если ls /boot показывает одно ядро — откат ядра уже почти невозможен.

GPO:

Get-GPO -All | Select-Object DisplayName, ModificationTime, Id
# Backup-GPO — до изменения, в каталог заявки

Решение

Шаблон rollback в заявке (обязательные поля)

  1. Триггер отката: например «SMB не открывается с двух ПК за 15 минут» / «пинг шлюза нет 5 минут».
  2. Действие: команды или GUI-путь, не «вернём как было».
  3. Источник: путь копии, имя restore point, номер правила firewall.
  4. Срок: уложиться в окно; если откат > окна — изменение не начинать.
  5. Кто: исполнитель + наблюдатель на P1-сервисах.

Сценарий A. Конфиг (nginx, nftables, sudoers)

sudo cp -a /etc/nginx/nginx.conf /root/chg-42/nginx.conf.pre
sudo nginx -t && sudo systemctl reload nginx
# откат:
sudo cp -a /root/chg-42/nginx.conf.pre /etc/nginx/nginx.conf
sudo nginx -t && sudo systemctl reload nginx

Сценарий B. Патч Windows Server

  • Точка backup VM/bare-metal до окна, статус job успешен.
  • Знать, uninstall какого KB или откат VM.
  • Не патчить DC и FILE01 одним окном без поочерёдной проверки.

Сценарий C. Сеть/firewall

Экспорт правил до. Откат — импорт или обратное правило с тем же комментарием CHG-42. Не «вспомним ACL». Связь со схемой.

Сценарий D. AD/GPO

New-Item -ItemType Directory -Force C:\Temp\chg-42-gpo | Out-Null
Backup-GPO -Name 'Contoso-File-Servers' -Path 'C:\Temp\chg-42-gpo'
# после провала:
Import-GPO -BackupGpoName 'Contoso-File-Servers' -Path 'C:\Temp\chg-42-gpo' -TargetName 'Contoso-File-Servers'

Не делайте Restore-GPO вслепую на весь домен. Одна GPO — один backup.

Когда отката нет

Пилот на копии, feature flag, dual-run. Если вендор не даёт downgrade — это должно быть сказано до окна, и owner сервиса принимает риск письменно.

Мини-каталог стандартных откатов

Заготовьте тексты на типовые правки, чтобы не выдумывать в 22:40. DNS A: удалить запись, Resolve-DnsName с клиента после TTL. Правило firewall с комментарием CHG-n: disable/удалить это правило, проверить тот же Test-NetConnection. Пароль svc-учётки: вернуть предыдущий из vault только если его не успели забыть сервисы — иначе это уже восстановление службы, не откат. Документируйте, какой вариант выбран до старта.

Для Ubuntu-пакета: apt-cache policy nginx до и после, возможность apt-get install nginx=<old> если репозиторий ещё отдаёт версию. Если зеркало сразу забывает старую — откат = restore VM/файлов из backup, и это должно быть сказано в CHG заранее.

Как проверить, что проблема устранена

  • В 10 последних normal-CHG есть заполненный rollback.
  • Выборочно: файл .pre или backup GPO реально существует, не «путь в заявке 404».
  • Учение: одно безвредное изменение с намеренным откатом (на тесте) прошло по тексту плана.
  • Emergency тоже имеют «как вернуть», пусть краткий.

Запись факта отката — в журнале, иначе в следующий раз план снова выдумают.

Если не помогло

  • Снимок VM «на час» оставили на месяцы: это уже риск диска, не rollback. Удаляйте после успеха окна по процедуре гипервизора.
  • Backup job врал: это проблема тестов restore, откат на такой job запрещён.
  • Изменение в SaaS без undo: готовьте ручной компенсирующий шаг (вернуть MX, вернуть TXT), не делайте вид, что rollback «не нужен».

Профилактика

  • Чеклист CHG в тикет-системе: поле rollback обязательное, иначе нельзя перевести в «в работе».
  • etckeeper / git на конфиги Linux.
  • Запрет править прод с ноутбука без копии.
  • Разбор неудачных окон: почему откат сработал медленно.

FAQ

Достаточно ли «есть Veeam» как rollback?

Нет. Нужны: имя job, точка до изменения, куда восстанавливать (не original overwrite по умолчанию), сколько это займёт vs окно.

Checkpoint Hyper-V для файлового сервера?

Кратко на время окна — обсуждаемо. Не забывать удалить. Для DC — не использовать как план.

Откат через «обратную правку в голове»?

Это не план. Пишите команды.

Что если откат опаснее, чем ехать вперёд?

Зафиксируйте в заявке: критерии «едем вперёд», кто решает (owner), эскалация. Молчаливое «ну поедем» в 23:40 — путь к двойной аварии.

Нужен ли rollback на добавление DNS A-записи?

Да, тривиальный: удалить запись. Именно такие стандартные откаты можно заготовить в каталоге standard changes.

Кто проверяет, что .pre не пустой?

Исполнитель до начала: Get-Item/ls -l в журнал. Второй человек на P1-сервисах.