Автоматизация рутинных проверок в инфраструктуре: личный опыт

Рутинные проверки инфраструктуры при ручном выполнении неизбежно обрастают ошибками — от забывчивости до расфокусировки. Автоматизация здесь не для галочки, а чтобы стабильно выявлять типовые проблемы до того, как они превратятся в инциденты. Я пришёл к этому не через хайп вокруг DevOps, а через обычную усталость: проверить сервисы, сверить конфигурации, убедиться, что бэкапы реально создаются, а сертификаты не истекают завтра — всё это отнимало время и грозило пропусками.

Почему ручные проверки ломают процесс

В любой инфраструктуре со временем накапливается повторяющаяся рутина. Перечень типовых операций выглядит примерно так:

  • проверить доступность сервисов;
  • убедиться, что диски не забиты;
  • посмотреть статус бэкапов;
  • сверить версии и конфигурации;
  • найти просроченные сертификаты;
  • проверить, что очереди, агенты и cron-задачи работают.

Сложность этих действий не в интеллектуальной нагрузке, а в том, что человек — плохой регистратор для регламентов. Память подводит, внимание смещается. Один день проверил всё, на следующий — пропустил хост, потом не заметил ошибку в логах, а ещё через неделю уже не вспомнишь, что было нормой «в прошлый раз». Автоматизация убирает этот человеческий фактор, делая проверки воспроизводимыми: один и тот же сценарий каждый раз даёт предсказуемый результат.

Что именно стоит автоматизировать в первую очередь

Начинать с полной автоматизации всего подряд — верный способ выгореть и не получить результата. Разумнее выбрать задачи, которые повторяются регулярно и приносят наибольшую пользу при автоматическом контроле.

Хорошие кандидаты для автоматизации

  • Доступность сервисов — HTTP, TCP, healthcheck, ping, DNS; это фундамент, без которого всё остальное не имеет значения.
  • Срок действия сертификатов — особенно если у вас много внешних точек входа: внезапно истёкший сертификат может обернуться простоем.
  • Бэкапы — проверять не только факт запуска, но и успешность, размер, свежесть; сообщение «бэкап выполнен» не гарантирует, что архив можно восстановить.
  • Состояние дисков и файловых систем — свободное место, inode, ошибки RAID; переполнение диска случается в самый неподходящий момент.
  • Cron и systemd-timer — работают ли запланированные задания; тихо упавший cron-задачу можно не заметить неделями.
  • Логи ошибок — появление новых критичных сообщений; запоздалая реакция на ошибки в логах часто превращает мелкую проблему в серьёзный инцидент.
  • Конфигурации — отклонения от эталона, дрейф настроек; незаметный конфигурационный дрейф со временем приводит к трудновоспроизводимым сбоям.
  • Версии пакетов и образов — если важно держать единый стандарт.

Что лучше пока не автоматизировать

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

Если процедура нестабильна, автоматизация только закрепит плохой процесс. Сначала стабилизируйте, потом автоматизируйте.

Как я выстраиваю автоматизацию: простой рабочий подход

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

Шаг 1. Формализовать правило

Любая проверка должна начинаться с трёх чётких ответов:

  • что считаем нормой;
  • что считаем отклонением;
  • что делаем при отклонении.

Например: норма — сертификат действителен ещё 30 дней; отклонение — осталось меньше 30 дней; действие — отправить уведомление в чат и в почту. Без такой формализации автоматизация вырождается в «скрипт ради скрипта».

Шаг 2. Сделать минимальный рабочий сценарий

Первый прототип должен быть максимально простым: shell-скрипт, запускаемый через cron или systemd timer, с выводом в stdout и использованием кода возврата для индикации успеха/ошибки. Не нужно городить микросервис с очередями — важно быстро получить полезный результат и проверить гипотезу. Код возврата — это простой контракт между скриптом и системой мониторинга: 0 означает норму, всё остальное — повод для внимания.

Шаг 3. Добавить понятный формат вывода

Если проверка предназначена ещё и для человека (а она почти всегда предназначена), результат должен быть понятен не только grep-у. Вывод должен содержать: что проверялось, какой результат, что именно не так и где искать детали. Хороший скрипт не просто пишет «ошибка», а объясняет: «сертификат на example.com истекает через 7 дней, проверьте вендора». Это экономит время при инциденте.

Шаг 4. Настроить уведомления

Без уведомления проверка нема. Но если алертов слишком много, команда вырабатывает иммунитет — их перестают читать. Разумная стратегия:

  • критичные события — оповещать немедленно (чат, пейджер);
  • предупреждения — направлять в отдельный канал или ежедневную сводку;
  • информационные сообщения — просто в журнал или отчёт.

Так сохраняется обзор без шумовой усталости.

Таблица: что автоматизировать и чем проверять

Ниже — сводка типовых задач, метрик и инструментов, которые я применял на практике. Это не исчерпывающий список, но хорошая отправная точка.

Задача Что проверяем Типичный инструмент
Доступность сервиса HTTP-код, ответ, задержку curl, wget, nagios-плагины
Сертификаты Срок действия, цепочку доверия openssl, скрипт на Python или Bash
Диск Свободное место, inode, ошибки df, du, smartctl, mdadm
Бэкап Факт выполнения, свежесть, размер скрипт + логика сравнения дат
Планировщик Запуск задания по расписанию cron, systemd timer
Логи Новые ошибки, повторяющиеся сбои grep, journalctl, ELK/Graylog
Конфиги Отличия от эталона diff, git, Ansible, шаблоны

Практика: какие инструменты реально удобны

Bash и Python

Bash хорош для линейных сценариев: проверить файл, дёрнуть API, вычислить дату сертификата и вернуть код. Он лёгок, предсказуем и почти всегда доступен. Python вступает в игру, когда логика усложняется: парсинг JSON, несколько источников данных, обработка исключений, необходимость аккуратно структурировать вывод. На практике я часто начинаю с Bash, а если скрипт начинает обрастать условиями, переписываю на Python.

Cron и systemd timer

cron — старый добрый инструмент, который работает везде. Но у systemd timer есть ряд преимуществ: вывод автоматически попадает в journalctl, можно привязать выполнение к определённому сервису, и окружение зачастую предсказуемее. Я предпочитаю timer, когда инфраструктура уже на systemd.

Ansible

Для тиражирования проверок на десятки серверов Ansible незаменим. Он позволяет описать эталонное состояние и сравнивать с ним факт, не плодя уникальные скрипты на каждом узле. Это особенно ценно, когда у вас парк серверов и нужно поддерживать конфигурационную гигиену.

Мониторинг и алертинг

Когда количество проверок переваливает за десяток, встаёт вопрос централизованного управления. Вместо того чтобы изобретать собственную систему оповещений, лучше отдавать результаты в существующий мониторинг: Prometheus с Alertmanager, Zabbix, Nagios/Icinga или Grafana с алертами. Главное — чтобы проверка не жила сама по себе, а была интегрирована в общий поток событий, где её можно отслеживать, фильтровать и связывать с инцидентами.

Типовые ошибки, которые я видел чаще всего

1. Проверка есть, а смысла нет

Самый распространённый антипаттерн — скрипт, который формально что-то проверяет, но не решает реальную проблему. Классика: бэкап завершился успешно, но не проверяется, можно ли восстановить данные из архива. Проверка должна валидировать не только факт, но и качество результата.

2. Слишком много алертов

Алертная усталость — верный признак того, что пороги занижены или уведомления приходят на каждую мелочь. Когда уведомлений сотни в день, сигнал тонет в шуме. Алерт должен означать событие, которое требует безотлагательного внимания, а не просто «на всякий случай».

3. Нет логики порогов

Бинарные проверки типа «есть/нет» часто слишком грубы. Для многих метрик нужны градации: например, свободное место на диске 90% — норма, 80% — предупреждение, 70% — критично. Без пороговой логики проверка либо молчит до последнего, либо воет без причины.

4. Сценарий не учитывает окружение

Production-окружение коварно: скрипт, идеально работающий на тесте, может упасть из-за отличий в правах, сетевых настройках, локали, переменной PATH, таймзоне или особенностях systemd. Всегда проверяйте на целевом окружении, а не ограничивайтесь песочницей.

5. Автоматизировали хаос

Автоматизация нестабильного процесса — это как строить дом на песке. Если правила игры меняются каждую неделю, сначала зафиксируйте процедуру, а затем уже автоматизируйте. Иначе вы будете автоматизировать постоянные переделки.

Как не потерять контроль над проверками

Полезно держать автоматику так же аккуратно, как и код приложения.

Минимальный набор правил

  • хранить скрипты в Git — это даёт историю, возможность code review и отката;
  • писать короткий README к каждой проверке — зачем, что считается нормой, какие пороги;
  • фиксировать, что считается нормой;
  • версионировать пороги и исключения;
  • не держать «магические числа» без комментариев;
  • проверять изменения на тестовом контуре, даже если скрипт кажется тривиальным.

Хорошая привычка

После каждой новой проверки я задаю себе один вопрос: «Если через полгода скрипт сломается, поймёт ли другой инженер, зачем он был написан и как его чинить?» Если ответ «нет», значит, автоматизация получилась хрупкой — не хватает документации или логика неочевидна.

Пошаговый шаблон для внедрения

  1. Выберите одну повторяющуюся проверку — не пытайтесь объять необъятное.
  2. Опишите её словами: что, как, когда и при каких порогах — это станет мини-спецификацией.
  3. Напишите минимальный скрипт — Bash или Python, без фреймворков.
  4. Протестируйте на одном узле или одном сервисе — сразу выявите нюансы окружения.
  5. Добавьте понятный вывод и код возврата — чтобы результат был ясен и человеку, и системе.
  6. Подключите уведомление — проверка без обратной связи бесполезна.
  7. Задокументируйте логику — README или комментарии в коде спасут через полгода.
  8. Раскатайте на остальные системы постепенно, контролируя эффект.
  9. Раз в квартал пересматривайте пороги и актуальность проверки — инфраструктура не стоит на месте.

Чек-лист перед запуском автоматизации

  • Проверка действительно решает повторяющуюся задачу — не делайте автоматизацию ради автоматизации.
  • Есть чёткая норма и понятный порог ошибки — без этого неясно, что является сбоем.
  • Скрипт работает без ручного вмешательства — не требует подкладывания паролей или ручного запуска.
  • Результат читается человеком — не сырой дамп, а осмысленный отчёт.
  • Есть уведомление при сбое — но настроенное так, чтобы не вызывать алертной слепоты.
  • Есть логирование — чтобы можно было восстановить хронологию событий.
  • Есть место, где хранится код и описание — Git, а не /tmp.
  • Проверка не создаёт лишнего шума — алерты только по делу.
  • Понятно, кто отвечает за результат — владелец процесса, который будет разбираться при инциденте.

Когда автоматизация окупается быстрее всего

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

FAQ

С чего лучше начать автоматизацию рутинных проверок?

С одной-единственной проверки, которая повторяется ежедневно и имеет чёткие критерии норма/отклонение. Например, срок действия сертификата. Не пытайтесь создать универсальную систему — начните с малого, получите результат и только потом масштабируйте.

Что важнее: скрипт или процесс?

Процесс. Скрипт — всего лишь инструмент. Без описанной логики (что проверяем, какие пороги, как реагируем) даже идеально написанный код будет либо молчать, когда нужно, либо шуметь без повода. Хороший процесс порождает понятный скрипт, а не наоборот.

Нужно ли сразу использовать сложные платформы?

Нет. Для первых шагов более чем достаточно связки Bash/Python и cron. Сложные платформы вроде Prometheus или Ansible становятся оправданы, когда количество проверок переваливает за десяток и требуется централизованное управление, визуализация и эскалация.

Какие проверки лучше всего автоматизируются?

Лучше всего автоматизируются проверки с бинарными или пороговыми метриками: доступность сервисов (HTTP/TCP), срок действия сертификатов, свободное место на дисках, факт и свежесть бэкапов, работа cron-задач и соответствие конфигураций эталону. Всё, что можно измерить и сравнить с ожидаемым значением.

Почему автоматические проверки иногда перестают помогать?

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

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

Поиск по ПДД