Створення golden-образів віртуальних машин через Packer

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

Створення образів віртуальних машин вручну: де ламається

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

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

Звідси розходження середовищ.

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

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

Далі діє снігова куля конфігурацій.

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

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

Ефект від єдиного еталона: швидкість випуску та відмови середовища

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

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

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

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

Окремо зникає цілий клас відмов — дрейф конфігурації.

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

Еталон збирається за декларативним описом (Packer та аналоги), і цей опис живе в системі контролю версій. Зміна проходить перевірку на тестовому контурі й лише потім потрапляє в парк.

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

Варіанти збірки еталонів: порівняння підходів

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

Розвилка проста — де закінчується загальне й починається часткове. Спільну частину (оновлення системи, агенти моніторингу, політики доступу) тримають у базовому еталоні й оновлюють одним прогоном, а роль вузла задають поверх нього.

Варіант Коли підходить Обмеження
Ручне налаштування вузла Разовий стенд, розвідка завдання Не відтворюється, історія змін втрачається
Скрипти первинного налаштування Перехідний крок без перебудови процесів Розгалуження накопичуються, повторний прогін ламає налаштоване
Збірка з декларативного опису (Packer) Регулярні релізи еталонів, рев’ю змін Потрібно описати всі кроки, включно з очікуванням готовності служб
Збірка поверх базового еталона Кілька ролей: веб-вузол, вузол бази, бастіон Жорстка прив’язка до версії базового еталона
Готовий еталон постачальника Швидкий старт на нестандартній платформі Склад закритий, власні агенти додаються із застереженнями
Ізольована збірка в окремому контурі Чутливі дані, вимоги ІБ Потрібен окремий контур і перенесення артефактів між сегментами

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

Як ми вибудовуємо конвеєр збірки еталонів

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

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

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

  3. Конвеєр збірки еталонів. Опис еталона живе як код: збірка на декларативних шаблонах (Packer) запускається за зміною в репозиторії, піднімається чиста машина, застосовуються скрипти налаштування, результат публікується в реєстр образів з версією та міткою.

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

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

  6. Регламент випуску. Передаємо документ: хто ініціює збірку, як версіонуються образи, скільки останніх версій зберігається, як відкотити версію еталона однією операцією. Далі конвеєр веде ваша команда.

Що передаємо на виході: описи, схеми, регламенти

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

  • Описи збірки — шаблони образів на кожну роль (веб-вузол, сервер застосунків, база) з базовим дистрибутивом, набором пакетів, скриптами налаштування та змінними під конкретний контур. Будь-яка правка проходить перевірку й потрапляє до історії змін.
  • Схеми інфраструктури — мережі, підмережі, правила міжмережевого екрана, точки монтування та вузли, куди публікуються готові еталони. Окремо зазначено, чим тестовий контур відрізняється від робочого.
  • Політики доступу — хто може збирати образ, хто має право публікувати його в робочий контур, як видаються й ротуються ключі збірки.
  • Інструкції експлуатації — покроковий порядок: зібрати еталон, прогнати перевірки в тестовому контурі, вивести в робочий, за потреби повернутися до попередньої версії.
  • Регламенти оновлення — періодичність перезбірки під патчі безпеки, порядок перевірки та зняття з експлуатації застарілих образів.
  • Каталог версій — який еталон відповідає якому релізу сервісу, щоб відкат займав хвилини, а не пошук потрібного файлу.
  • Матриця перевірок — що саме тестується на образі до публікації: завантаження, мережа, агент моніторингу, відсутність зайвих облікових записів і стандартний набір пакетів.

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

Кейс: менше розходжень середовищ і швидший випуск

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

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

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

Що змінили

Опис образу перенесли в репозиторій поряд з кодом продукту й збираємо еталони через HashiCorp Packer.

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

Відновлення сервера звелося до розгортання останнього еталона: параметри не відновлюють з пам’яті, вони вже всередині образу.

Показник До Після
Випуск нового середовища 5–6 днів 40–60 хвилин
Частка ручних правок близько 70% менше 10%
Розходження між стендами знаходили вручну, вже на проді порівнюються автоматично, одиниці
Відновлення сервера півдня з пам’яті 15 хвилин з еталона

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

Чим еталон відрізняється від ручного налаштування сервера?

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

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

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

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

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

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

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

Часті технічні питання щодо збірки еталонів

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

Як перевірити, що образ збирається відтворювано?

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

Як оновлюється еталон без простою?

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

У нас сервери налаштовані руками — їх можна перенести?

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

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

У нас уже є свій конвеєр збірки

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

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

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

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

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

Вхідні дані, які прискорюють оцінку обсягу:

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

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

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

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

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