Настройка 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