· 14 мин чтения

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

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

Привет всем! Я, Семёнов Евгений Сергеевич, директор ITFresh. Сегодня расскажу вам про один крутой кейс, который случился у нас в 2025 году. Только представьте: приходит к нам веб-студия с командой в 18 человек, у них больше 40 клиентских серверов, и один-единственный сисадмин, чья работа сводилась к бесконечным накатываниям обновлений. Знакомо? Мы внедрили Ansible, и теперь вместо восьми часов на всю эту рутину уходит всего 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. У нас есть один-единственный мастер-пароль, известный строго двум людям: сисадмину клиента и мне, как куратору всего проекта. Структура файлов внутри 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 вам нужен, а когда — нет

За пятнадцать лет в IT я насмотрелся всякого: как Ansible бездумно пихают куда ни попадя, а где он реально спасает, его почему-то игнорируют. Делюсь своими выводами:

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

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

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

Когда клиент приходит к нам, в ITFresh, за внедрением 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 подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.