Налаштування openSUSE/SLES: YaST, zypper, AppArmor і автоматизація

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

Чому встановлення openSUSE на бойовий сервер іде не за планом

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

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

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

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

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

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

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

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

Передбачувані оновлення та відкат: що змінюється в експлуатації

Парк на єдиній гілці SUSE Linux Enterprise та openSUSE перестає бути набором «особливих» машин: автоматизація налаштування описує вузол декларативно — ті самі репозиторії, профілі AppArmor і правила доступу. Новий вузол вводиться в дію за десятки хвилин замість чек-листа, який інженер проходить з пам'яті.

Розгортання: один прогін замість ручних проходів

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

Вікна обслуговування: оновлення за планом

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

Відкат оновлень: операція, а не аварійне відновлення

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

Зникає клас відмов «попливлої» машини

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

Режими встановлення openSUSE: мінімальний, повний, мережевий

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

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

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

Варіант Коли підходить Обмеження
Мінімальне встановлення: база й ядро Сервери, віртуальні машини, шлюзи — роль ставиться окремо Немає графіки й прикладних груп: утиліти додають через zypper вручну
Повне встановлення з робочим столом Станції інженерів, демонстраційні стенди Тягне графіку й офісні групи: більше пакунків і більші оновлення
Мережевий режим розгортання Парк однотипних машин, перевстановлення без носіїв Потрібен власний сервер завантаження й стабільний канал; репозиторії вказують вручну
Автоматизоване встановлення за профілем Десятки вузлів, відтворювані середовища, тиражування ролі Помилка в описі конфігурації розмножується на весь парк
Готовий образ із наперед встановленим набором Типові ролі: веб-вузол, база, термінал Правки вносять перезбиранням образу, а не доустановленням пакунка

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

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

Порядок робіт: від інвентаризації до передачі в супровід

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

Етапи впровадження

  1. Аудит інфраструктури. Збираємо перелік вузлів, ролей, служб, мережевих зон і зовнішніх залежностей. На виході — карта, де видно, що переноситься в загальний шаблон, а що залишається унікальним для конкретної машини.
  2. Проєктування схеми конфігурації. Розкладаємо систему на профілі: базовий образ, роль, перевизначення для вузла. Фіксуємо, що описується декларативно, що робиться штатними засобами openSUSE і SLES, а де потрібні окремі політики AppArmor.
  3. Підготовка еталонного образу й ролей. Збираємо образ збірки, автоматизуємо встановлення пакунків через zypper, шаблонізуємо системні параметри, виносимо секрети з репозиторію в захищене сховище.
  4. Перевірка на стенді. Розгортаємо копію контуру й проганяємо сценарії: чисте встановлення, оновлення поверх попередньої гілки, відкат, робота профілів захисту. Помилки ловимо тут, а не на продуктивних вузлах.
  5. Розгортання на цільових вузлах. Йдемо групами з точками контролю між ними — за відхилення метрик група зупиняється, решта не зачіпається.
  6. Передача в супровід. Віддаємо документацію зі збірки, регламент оновлень, порядок відкату й передаємо знання вашій команді — щоб правки ролей не вимагали нас щоразу.

Конфігурації, регламенти й документація: що передаємо

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

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

  • Конфігурації та ролі. Опис вузлів — пакунки, репозиторії zypper, сервіси, параметри монтування, профілі AutoYaST і ролі автоматизації. Новий сервер повторює еталон, а не збирається руками.
  • Схеми інфраструктури. Топологія мережі, розбиття дисків і логічних томів, точки монтування, розміщення сервісів — за ними новий інженер орієнтується в перший день.
  • Політики доступу. Облікові записи й групи, схема sudo, ключі SSH, профілі AppArmor у режимі обмеження, матриця «хто куди ходить»: права видаються за роллю, а не за ситуацією.
  • Регламент обслуговування. Періодичність оновлень, порядок перезавантажень, вікна робіт, перевірка стану репозиторіїв і вільного місця, порядок дій у разі збою.
  • Резервне копіювання. Що копіюємо — конфіги, дані, стан сервісів, з якою частотою, де зберігаються копії, як і ким перевіряється відновлення.
  • Інструкції для чергової зміни. Типові операції та реакції на інциденти покроково, з командами й ознаками того, що сценарій пішов інакше.
  • Документація щодо серверів. Інвентар із ролями вузлів, власниками, залежностями й адресами, підтримуваний в актуальному вигляді, а не написаний один раз.

Кейс: парк із сорока серверів перевели без зупинки сервісів

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

Встановлення одного вузла займало 3-4 години — розмітка дисків, мережа, пакунки, профілі безпеки, — і все це із супроводом інженера.

Дорожче виходили оновлення. Ядро й системні бібліотеки міняли групами по 8-10 машин у нічне вікно, бо після перезавантаження частина сервісів не піднімалася через розбіжності в конфігурації.

Дрейф накопичувався: у третини машин відрізнялися ліміти, правила AppArmor і версії пакунків, а плановий простій сервісу займав 25-40 хвилин.

Що змінили

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

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

Розгортання нового вузла скоротилося з 3-4 годин до 12 хвилин, з ручних кроків залишилися тільки фізичне підключення й перевірка. Оновлення всього парку йде одним прогоном за 25-30 хвилин замість чотиригодинного вікна.

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

Кількість машин з відхиленням від еталона впала з третини до нуля — конфігурація тепер описана, а не відтворюється з пам'яті.

Що робити, якщо парк уже розгорнуто на іншому дистрибутиві

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

Починаємо з інвентаризації: які ролі є й що спирається на особливості попередньої платформи.

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

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

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

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

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

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

Сумніви щодо сумісності, оновлень і відкату

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

Оновлення без простою взагалі можливі?

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

Що буде, якщо оновлення зламає систему?

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

Пакунки зі сторонніх репозиторіїв не зламають систему?

Сумісність пакунків перевіряється до розкочування: налаштовуємо пріоритети репозиторіїв у zypper, фіксуємо версії критичних пакунків і відсікаємо джерела, які тягнуть конфліктні залежності. Зовнішні репозиторії підключаємо точково, а не «про всяк випадок».

Обов'язковий окремий тестовий стенд?

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

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

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

Обговоримо задачу й повернемося з оцінкою та планом робіт

Щоб оцінка була предметною, а не «приблизно так», потрібен зріз парку й обмежень, у яких доведеться працювати. Чим точніші вхідні дані, тим менше припущень у плані впровадження й тим менше правок після старту.

Що надіслати в першому повідомленні:

  • перелік серверів: кількість машин, дистрибутив та його гілка (openSUSE Leap, SLES), встановлення вже йде чи лише планується;
  • ролі серверів: де веб, де бази, де віртуалізація — від цього залежить порядок оновлення й набір профілів YaST;
  • як керуються пакунки й конфігурації: zypper вручну, Ansible, Salt чи власні скрипти — що залишити, що замінити;
  • вікна обслуговування: допустимий простій на групу серверів, наявність резервних копій і точок відкату;
  • вимоги до журналювання й захисту: чи потрібен AppArmor, аудит дій sudo, вивантаження логів у зовнішню систему;
  • доступи й мережа: закритий контур без виходу назовні, власний репозиторій дзеркал, спосіб видачі доступу інженерам;
  • стенди й майданчики: один контур чи кілька, чи є копія продуктивного середовища для перевірки політик.

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

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

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

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

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