· 14 мин чтения

От 8 часов до 15 минут: автоматизация 40 серверов через Ansible

Семёнов Евгений Сергеевич, директор АйТи Фреш. Расскажу про реальный проект 2025 года: веб-студия из 18 человек, 40+ серверов клиентских проектов, штатный сисадмин, который тратил полные рабочие дни на накатывание обновлений. После полутора недель внедрения Ansible вместо 8 часов получили 15 минут — и не потеряли ни одного сервиса. Делюсь, как это было устроено и где мы поначалу набили шишек.

С чем мы пришли

Веб-студия в районе Электрозаводской: разработка и сопровождение сайтов на Битрикс, Tilda, кастомных WordPress-сборок. У них в обслуживании было 42 сервера у 14 клиентов — Debian 11/12, CentOS Stream, у двух клиентов — Ubuntu 22.04. На каждом примерно одинаковый набор: Nginx, PHP-FPM 8.1/8.2, MariaDB, Redis, fail2ban, ssh-ключи команды, бэкап rsync на NAS клиента.

Сисадмин у них был один — толковый парень, но затопленный рутиной. Каждое второе утро начиналось с обхода 10–12 серверов: накатывание обновлений безопасности через apt, проверка свободного места, перезапуск зависших php-fpm пулов, добавление сотрудников в access-листы. Полный обход всех серверов занимал около 8 часов и делался раз в две недели — в результате обновления накапливались, мелкие ошибки тоже накапливались, и в итоге каждый второй понедельник он фигачил с 9:00 до 19:00 без обеда.

Почему именно Ansible

Когда меня позвали на консультацию, я предложил три варианта: Ansible, SaltStack или Puppet. Объяснил разницу:

Решили на Ansible — он закрывает 95% задач малого и среднего бизнеса в Москве и не требует от инженера переучиваться с админа на разработчика. За пятнадцать лет работы с инфраструктурами я могу сказать: на масштабе до 200 серверов лучше Ansible нет ничего. После — стоит смотреть в сторону GitOps и Argo CD, но это уже другая история.

Архитектура решения

Мы развернули следующую схему. Управляющий узел — небольшой Debian 12 на 2 vCPU/2 GB RAM в их собственной серверной (нет смысла платить за виртуалку, Ansible сам по себе ничего не нагружает). На нём:

На каждом из 42 управляемых серверов — отдельный сервисный пользователь ansible с sudo-правами без пароля. Доступ ему настроен только с управляющего узла по ключу. Это безопаснее, чем ходить под root, и проще, чем держать персональные ключи на каждом сервере.

Inventory: как структурировать 42 сервера

Главный совет, который я даю всем, кто внедряет Ansible впервые: вложите время в продуманный inventory с самого начала. Перепиливать его потом — больно. Мы пошли по двухуровневой схеме:

inventories/
  production/
    hosts.yml              # сами хосты с IP
    group_vars/
      all.yml              # глобальные переменные
      webservers.yml       # для всех веб-серверов
      dbservers.yml        # для всех БД
      client_acme.yml      # для всех серверов клиента ACME
    host_vars/
      web01.acme.local.yml # уникальные настройки конкретного хоста

В hosts.yml серверы группировались по двум измерениям одновременно: по роли (webservers, dbservers, cache, monitoring) и по клиенту (client_acme, client_beta, client_gamma). Это позволило одной командой обновить все веб-серверы либо все серверы конкретного клиента, не путаясь.

Роли: переиспользуемая основа

Мы написали восемь базовых ролей, которые покрывали 90% потребностей:

Каждая роль документирована в README.md внутри роли: какие переменные она ожидает, какие меняет файлы, как тестировать. Это стало золотым правилом — чтобы через полгода новый инженер мог разобраться без помощи автора.

Vault: где живут секреты

Все секреты — пароли БД, ключи Yandex Object Storage для бэкапов, токены Telegram-ботов мониторинга — в Ansible Vault. Один мастер-пароль, который знают только два человека (сисадмин клиента и я как куратор). Структура файлов:

group_vars/
  client_acme/
    vars.yml      # обычные переменные, в git как есть
    vault.yml     # зашифрованные секреты

В vars.yml ссылки на секреты вида db_password: "{{ vault_db_password }}", а сами значения — в зашифрованном vault.yml. Это позволяет хранить весь репозиторий в Git, в том числе на собственном Gitea клиента, без риска утечки.

Тестовый прогон: как мы избежали падения 42 сайтов

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

  1. Любой плейбук сначала тестируется в режиме --check --diff — Ansible показывает, что собирается изменить, не делая этого.
  2. Реальный прогон сначала на одном тестовом сервере (мы выделили под это пустую виртуалку).
  3. Потом на 1–2 серверах одного клиента поспокойнее (внутренний проект студии, не клиентский).
  4. Только после успешного прохождения — на production-серверах с использованием --limit по группам и serial: 5 в плейбуке (обновляем по 5 серверов одновременно, чтобы не положить всё сразу).

За полтора месяца внедрения у нас был один инцидент — на двух серверах сломался PHP из-за того, что в роли мы зафиксировали версию 8.1, а у клиента стояла кастомная сборка 8.2 с PECL-модулем. Откат через git revert и повторный прогон занял 8 минут. С тех пор перед обновлением PHP мы всегда смотрим, какие нестандартные модули установлены — и зашиваем это в host_vars.

Что получили в итоге

Через шесть недель после старта внедрения метрики выглядели так:

ЗадачаРаньшеПосле Ansible
Накатывание обновлений на 42 сервера8 часов15 минут
Развёртывание нового PHP-проекта4 часа25 минут
Добавление нового сотрудника команды1.5 часа3 минуты
Аудит конфигурации серверовне делалсяеженедельно автоматически
Восстановление сервера после сбоя2–4 часа40 минут

Финансовый эффект клиент посчитал сам: освободившиеся 60–70 часов в месяц у штатного сисадмина превратились в работу над проектами, которые раньше отдавали на сторону. Зарплату ему увеличили на 20% (заслуженно), но это всё равно вышло дешевле, чем нанимать второго инженера или платить за внешние подрядки.

Грабли, на которые мы наступили

Чтобы вы не повторяли наших ошибок:

Когда Ansible вам нужен, а когда — нет

За пятнадцать лет работы я видел, как Ansible внедряют там, где он не нужен, и не внедряют там, где он критичен. Мои наблюдения:

Ansible нужен, если:

Ansible не нужен, если:

Сколько стоит внедрение под ключ

Когда мы в АйТи Фреш делаем внедрение Ansible для клиента, типовой проект выглядит так:

Типовой бюджет — 95 000–180 000 руб. за полное внедрение с обучением вашего штатного сисадмина. Окупается за 2–4 месяца только за счёт экономии времени на рутине.

Хотите такой же эффект для вашей инфраструктуры?

Если у вас 10+ серверов и команда тратит часы на одни и те же действия, я готов приехать и за 1 рабочий день показать, что и как можно автоматизировать в вашем конкретном случае. Аудит бесплатный, по итогам — письменное предложение с разбивкой по этапам и срокам.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — частые вопросы по Ansible

С какого количества серверов имеет смысл внедрять Ansible?
Окупается с 5–7 однотипных серверов. На двух-трёх можно ходить руками. С двадцати становится критично, с пятидесяти — без Ansible невозможно.
Сколько занимает внедрение Ansible с нуля?
Базовая инфраструктура — inventory, 5–7 ролей, vault, документация — 3–5 рабочих дней инженера. Полная автоматизация типового веб-стека — 10–15 дней.
Нужен ли отдельный сервер под Ansible?
Нет, Ansible не требует серверной части на узлах — только SSH. Управляющий узел можно держать на ноутбуке инженера, на bastion-сервере или в виде CI-раннера в GitLab/Gitea.
Что выбрать — Ansible или Puppet/Chef?
В 2026 году Ansible занимает 70%+ рынка благодаря YAML-синтаксису и отсутствию агента. Puppet/Chef остаётся в крупных корпорациях, где исторически используется.
Можем ли мы заказать внедрение Ansible под ключ?
Да, в АйТи Фреш мы делаем полный цикл: аудит инфраструктуры, написание ролей под ваши сервисы, документация, обучение ваших инженеров. Бюджет от 95 000 руб.

Подпишитесь на рассылку ITfresh

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

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.