Розробка Ansible Playbooks для автоматизації інфраструктури

Ручне налаштування серверів тримає команду в заручниках: одна правка поза регламентом — і середовища розходяться. Ми розробляємо Ansible playbooks під ключ: описуємо конфігурацію як код, щоб розгортання займало хвилини й повторювалося без помилок.
Часті запитання

Розробка Ansible playbooks: де ручне налаштування ламається

Ручне налаштування серверів починається безневинно: кілька команд через SSH, власний порядок встановлення пакетів, десь підправлений конфіг. Знання про те, «як правильно», живе в голові інженера та в історії його термінала — ані в репозиторії, ані в документації.

Поки сервер один, це працює; на третьому й п’ятому середовищі починається розбіжність, яку ніхто не відстежує.

Розбіжності між середовищами проявляються як «у мене локально все піднімається». Тестове середовище зібране в одному порядку, бойове — в іншому, і різниця випливає не на етапі перевірки, а в момент релізу.

Налагодження переходить у бойовий контур, де немає права на помилку, а причина розбіжності все ще не встановлена.

Дрейф конфігурації накопичується непомітно: «тимчасова» правка лімітів, обхідний маршрут, ручний перезапуск служби. Ці зміни не потрапляють ані до системи контролю версій, ані до опису стенда — за місяць ніхто не може сказати, чим бойовий сервер відрізняється від еталонного. Наступний інженер успадковує не інфраструктуру, а набір здогадів про неї.

Відновлення після збою стає найдорожчим етапом. Сервер піднімають із пам’яті, у поспіху, відтворюючи кроки в неправильному порядку, — і незапланований простій розтягується на години замість хвилин. Відкат теж не гарантований: попередній стан ніхто не зберігав як артефакт.

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

Що дає керована конфігурація замість ручних правок

Поки зміни вносяться на сервери руками, конфігурація живе в головах і в історії чатів. Два стенди, підняті «за тією самою інструкцією», розходяться в деталях: забутий ліміт, зайвий відкритий порт, різна версія бібліотеки.

Розробка Ansible playbooks переносить ці рішення до репозиторію — опис стає єдиним джерелом правди, з яким стан порівнюють, а не звіряють із пам’яттю.

Відтворюваність середовищ перестає залежати від того, хто саме розгортав. Тестовий контур, приймання та продуктив збираються одним сценарієм із різними параметрами, тому розбіжність видно на прогоні, а не в момент релізу.

Час розгортання середовища скорочується до десятків хвилин: стенд з’являється цілком — із налаштуваннями сервісів, правами та сертифікатами.

Прогін ідемпотентний: повторний запуск приводить систему до описаного стану й не ламає вже налаштоване. Це знімає цілий клас відмов — правки «лише на одному вузлі», конфіги, що роз’їхалися після ручного втручання, зміни, які неможливо повторити.

Відкат теж описаний: повернення до попередньої ревізії ролей — один прогін замість розбору за логами.

Скорочення тривалості простою йде звідти ж: вузол відновлюється не ручним складанням, а прогоном ролі на чистій машині. Перевірки виконуються до застосування, тому частина проблем ловиться на тестовому контурі, а не на бойовому.

Інфраструктура стає тим, що можна описати, перевірити й повторити, а не підтримувати постійною ручною увагою.

Способи опису інфраструктури: порівняння підходів

Способи опису інфраструктури відрізняються не синтаксисом, а тим, як поводитиметься код на третій-четвертій правці, коли до конфігурації додаються нові середовища та типи вузлів.

Ми пройшли через кожен із чотирьох варіантів на реальних проєктах — нижче порівняння за критеріями, які важливі під час передачі в підтримку.

Спосіб опису Коли підходить Обмеження
Декларативний опис стану Однотипний парк машин, потрібно відтворювано піднімати нові вузли з нуля Погано лягає на розгалужену логіку та разові ручні операції
Ролі та сценарії за призначенням Різні типи вузлів — веб, СУБД, черги; повторне використання між проєктами Обростають перехресними зв’язками, якщо не тримати межі ролі та порядок застосування
Власні модулі Нестандартне обладнання та внутрішні API, для яких немає готових рішень Власна підтримка та сумісність залежностей, кожен модуль потребує тестів
Гібридний підхід Основна частина — декларативно, нестандартні кроки — окремими сценаріями Складніше читати, потрібна дисципліна оформлення та єдиний стиль для всієї команди

Головне обмеження підходу — його передбачуваність під час повторного запуску: плейбук, який проходить чисто на порожній машині й ламається на працюючій, обходиться дорожче за ручне налаштування.

Тому перед здачею ми проганяємо конфігурацію двічі на тестовому контурі й перевіряємо, що другий запуск не змінює стан вузлів. Якщо розбір вашого завдання показує, що готові ролі закривають 80% вимог, гібридний варіант виявиться дешевшим у підтримці, ніж повністю власна розробка.

Етапи впровадження: від аудиту до передачі регламентів

Автоматизація виправдана, коли той самий стан відтворюється на будь-якому середовищі без ручних правок — це критерій приймання.

Етапи йдуть послідовно: кожен наступний спирається на артефакти попереднього, тому перший запуск на продуктивному контурі стає перевіркою узгодженої моделі, а не експериментом.

Послідовність етапів

  1. Аудит інфраструктури. Збираємо фактичний стан: інвентар серверів, ролі вузлів, встановлені служби та ручні правки, яких немає в репозиторіях. На виході — карта розбіжностей між поточним налаштуванням і цільовим.

  2. Схема середовищ. Фіксуємо склад середовищ та їхні відмінності: адреси, облікові записи, набір служб. Інвентар і групи хостів описуємо так, щоб новий вузол додавався без правки логіки.

  3. Проєктування ролей. Розкладаємо конфігурацію на ролі Ansible з повторно виконуваними завданнями: повторний запуск не змінює вже цільовий стан. Змінні виносимо назовні, секрети — до захищеного сховища.

  4. Перевірка конфігурації. Проганяємо розбір синтаксису та правила оформлення до запуску, звіряємо значення змінних і доступність вузлів. Більшість помилок відсікається тут, а не на продуктивному середовищі.

  5. Тестовий прогін. Спочатку — запуск у режимі перевірки без змін, потім повний прогін на копії продуктивного контуру. Порівнюємо стан вузлів до й після та окремо перевіряємо повторний запуск.

  6. Передача та навчання команди. Віддаємо репозиторії, регламенти, порядок відкату й розбираємо типові зміни на живому прикладі.

Далі правки вносяться через ті самі ролі, а стан середовищ підтверджується повторним запуском, а не пам’яттю адміністратора.

Артефакти на виході: ролі, схеми, регламенти

Розробка Ansible playbooks закінчується не успішним запуском, а набором артефактів, які залишаються у вашому репозиторії та працюють без нас. Нижче — що саме передаємо на руки та як кожен елемент використовується в повсякденній експлуатації.

  • Структура ролей — дерево roles/ із розподілом за сервісами: загальні ролі для базового налаштування хостів, окремі під прикладні компоненти. Змінні винесені в групові та хостові файли, тому той самий опис застосовується до контуру цілком, а не копіюється за завданнями.
  • Схема середовищ — склад контурів, їхній інвентар і групи хостів з описом того, які ролі куди застосовуються та які параметри відрізняються між стендами. Відразу видно, де можна експериментувати, а де зміни йдуть у продуктив.
  • Політики доступу — розмежування прав на запуск: хто може застосовувати зміни на тестовому контурі, хто на продуктивному, під якими обліковими записами та ключами це робиться. Секрети зберігаються в окремому захищеному сховищі, а не в репозиторії.
  • Документація з експлуатації — опис кожної ролі, повний перелік змінних із призначенням і значеннями за замовчуванням, порядок запуску та типові операції: підключення нового хоста, оновлення версії сервісу, повернення до попереднього стану.
  • Регламент змін — як проходить правка: окрема гілка, перевірка синтаксису та лінтер, прогін на тестовому контурі, рев’ю, застосування. Там же зафіксовано, хто погоджує зміни та за якою ознакою приймається рішення про відкат.
  • Перевірки в конвеєрі — автоматичні сценарії на синтаксис і повторюваність: прогін ролі двічі підряд не повинен змінювати конфігурацію, інакше завдання переписано неправильно й у продуктиві дасть неочікуваний результат.
  • Карта залежностей — які ролі спираються на інші, у якому порядку застосовуються, що станеться при випадінні одного кроку. Допомагає не зламати стенд під час додавання нового компонента.

Кожен пункт — не звіт для полиці, а робочий інструмент: інженер, який раніше не бачив проєкт, розгортає стенд з нуля за документацією та регламентом, не ставлячи нам запитань.

Кейс: як прибрали розбіжності між середовищами

Замовник — інтегратор сервісів для бізнесу з чотирма контурами: розробка, тестовий, передпродуктивний і продуктивний.

Середовища збирали вручну за внутрішнім регламентом, і конфігурації збігалися лише частково: розбіжності в параметрах сервісів, версіях залежностей і лімітах випливали на проді під час релізу. На типове розгортання йшло 40–60 ручних операцій і 2–4 години інженера.

Відновлення вузла, що впав, займало до п’яти годин: порядок дій тримався в голові двох інженерів і в інструкції, яка відставала від реальності. Помилка в одному кроці переносилася в усі контури — розбіжності накопичувалися й виявлялися вже тоді, коли коштували простою.

Що змінили

Інфраструктуру описали як код на Ansible: ідемпотентні ролі за сервісами, окремий інвентар на кожен контур, значення змінних зведені у файли середовищ, секрети винесені з репозиторію.

Повторний прогін не змінює стан, якщо система вже в цільовому вигляді, — на цьому будується перевірка розбіжностей. Перед застосуванням playbooks проганяються в режимі без змін, і дрейф видно до того, як він дійде до прода.

Що стало

Ручні операції на реліз скоротилися з 40–60 до нуля: інженер запускає один і той самий набір ролей у всіх контурах. Розгортання займає 12–15 хвилин замість 2–4 годин, підняття стенда з нуля — близько півгодини, відновлення вузла — 8 хвилин проти п’яти годин. Узгодженість середовищ тепер перевіряється кодом, а не інцидентом.

Повторюваність розгортання перестала залежати від того, хто саме виконує роботу: новий інженер вводиться в контур за один робочий день. Це і є результат кейса автоматизації інфраструктури — однаковий результат незалежно від середовища та виконавця.

Чим відрізняються ролі від сценаріїв в Ansible

Сценарій — це точка входу: він описує, що і в якому порядку застосувати до групи хостів. Усередині — список завдань або викликів ролей, прив’язка до інвентарю, умови та обробники.

Він відповідає на питання «що зробити з цими серверами зараз», але за своєю природою погано переноситься на інший проєкт: логіка прив’язана до конкретних імен хостів і порядку запуску.

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

Тому той самий код налаштовує стенд розробки, тестовий контур і продуктив без копіювання гілок коду.

Практична різниця видна на другій-третій зміні вимог. Якщо логіка розмазана по сценаріях, правка в одному місці потребує синхронної правки в усіх інших — так з’являється дрейф конфігурації, коли стенди розходяться між собою.

Роль правиться один раз, а версія закріплюється в залежностях, тому оновлення розкочується контрольовано та відкочується зміною версії.

Структура проєкту автоматизації будується навколо цього розділення: інвентар і змінні за групами хостів, каталог ролей, окремі сценарії під типові операції — розгортання, оновлення, регламентне обслуговування.

Інженер, який уперше відкрив репозиторій, знаходить потрібний файл за іменем ролі, а не читає підряд тисячі рядків.

Підтримка чужого коду тримається на тих самих правилах: ідемпотентні завдання, задокументовані значення за замовчуванням, мітки для часткового запуску та перевірка в режимі попереднього перегляду.

Чим менше в сценарії хардкоду на конкретний хост, тим дешевше його змінювати й тим швидше проходить перевірка перед викаткою.

Технічні сумніви: часті питання щодо автоматизації

Розбір завдання майже завжди впирається в ті самі питання: що буде, коли склад сервісів зміниться, де лежать паролі, чи безпечно запускати набір повторно та як перевірити зміни, нічого не зламавши. Нижче — робочі відповіді, які ми даємо до старту робіт, а не після здачі.

Набори проєктуються як підтримуваний код: ролі ділять відповідальність, змінні винесені за середовищами, інвентар описує групи хостів. Додати новий сервіс — означає дописати роль і підключити її до загального сценарію, не переписуючи решту логіки.

Як підтримувати конфігурацію, коли сервісів і середовищ стає більше?

Ролі та змінні за середовищами дозволяють багаторазово використовувати одну логіку на стенді та в робочому контурі, відрізняючись лише значеннями. Шаблони конфігів лежать у репозиторії з історією правок — видно, хто і навіщо змінював параметр, і зміну можна відкотити.

Де зберігаються паролі та ключі доступу?

У зашифрованому сховищі поруч зі сценаріями: розшифрування відбувається лише в момент виконання, а ключ доступу зберігається поза кодом. У відкритому вигляді секретів немає ні в наборах, ні у виводі завдань, ні в логах прогону.

Чи безпечно запускати набір повторно?

Так. Завдання описуються так, що повторний прогін приводить систему до того самого стану й не чіпає те, що вже налаштовано правильно. Перед застосуванням запускаємо прогін у режимі перевірки без змін — він показує, які хости та параметри буде заторкнуто, але нічого не змінює.

Що залишається вашим інженерам після передачі?

Опис структури набору, інструкції з типових операцій — додати хост, завести середовище, змінити секрет — і розбір із командою. Далі ваші спеціалісти ведуть конфігурацію самостійно, без нашої підтримки.

Обговоримо завдання: що потрібно для коректного старту

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

  • Список вузлів та їхніх груп: скільки серверів, які ролі вони виконують, один контур чи кілька майданчиків.
  • Доступи та спосіб підключення, облікові записи з правами підвищення, наявність закритого контуру без зовнішньої мережі — від цього залежить схема доставки та запуску.
  • Поточний стан: як налаштовано зараз, які є ручні інструкції та скрипти, що використовуємо повторно, а що переписуємо.
  • Цільові середовища та відмінності між ними: тестове, передпродуктивне, продуктивне — які параметри відрізняються та де вони зберігаються.
  • Вимоги до повторних запусків: чи повинен сценарій безпечно проходити на вже налаштованому вузлі й не затирати дані.
  • Порядок викатки та вікна змін: чи можна перезапускати сервіси, чи є обмеження за часом і чергуваннями.
  • Критерії приймання: як ви переконаєтесь, що роль працює — перевірки на тестовому стенді, звірка конфігурацій, звіт про прогін.

Розробка Ansible Playbooks рідко йде одним заходом: спочатку інвентаризація та каркас ролей, потім обкатка на тестовому контурі, далі поетапна викатка з погодженням етапів на кожному кроці.

Опишіть завдання та додайте те, що вже є, — повернемося з оцінкою та планом, де зафіксовані обсяг, порядок робіт і точки контролю.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142