Программирование, радиоэлектроника,
саморазвитие и частичка из моей жизни здесь...

LXC Builder - управление Linux контейнерами с помощью Python, консольный менеджер

Простой консольный менеджер для управления Linux контейнерами (LXC), написанный на Python. Сборка контейнеров из подготовленных шаблонов, автоматическая установка программного обеспечения, простая настройка и управление. Ограничение CPU, RAM, HDD, возможность указать путь для хранения контейнеров и многое другое.

Решил поделиться небольшой разработкой, которая упрощает процесс создания, запуска и управления контейнерами, собранными из легко настраиваемых шаблонов для разных операционных систем (ОС) и наборов программного обеспечения (ПО).

Содержание:

Предназначение

Программа создавалась прежде всего для помощи при тестировании и разработке программного обеспечения используя LXC контейнеры.

Благодаря ей можно буквально в несколько шагов создать и запустить контейнер с уже предустановленным и настроенным набором программного обеспечения, которое доступно в изолированной полноценной ОС.

Один из примеров использования - создание и отладка проектов с применением так называемого стека технологий LAMP (Linux + Apache + PHP + MySQL), в которых версии установленного ПО (например PHP5, PHP7, MySQL 5.5 и т.д.) могут играть решающую роль.

Для тестирования работы гео-зависимых служб и сайтов можно создать несколько контейнеров с прокси-серверами.

LXC-контейнеры отлично подходят для обучения программированию, системному администрированию и DevOps. Используя LXCBuilder можно просто и удобно создавать заготовки контейнеров с различными ОС, управлять ими и писать шаблоны своих заготовок с наборами уже сконфигурированных программ и служб.

Также Python-класс "LXCBuilder" можно применить при разработке других программных систем, в которых задействован механизм изоляции LXC.

Основные возможности

Основные возможности и особенности проекта следующие:

  • Поддержка LXC 2.0+;
  • Построен с использованием вызовов родных команд lxc-*;
  • Реализованы наиболее часто используемые при работе функции (create, start, stop, delete...);
  • Использована основная библиотека модулей Python, нет других зависимостей;
  • Можно указать свою директорию для хранения контейнеров;
  • Поддержка собственных шаблонов для создания и настройки контейнеров.

Система шаблонов:

  • Простота написания и редактирования;
  • Возможность указать операционную систему, ее релиз и архитектуру;
  • Ограничение ресурсов RAM, CPU + вся мощь опций CGroups;
  • Возможность указать любую опцию для установки в конфигурационном файле контейнера;
  • Возможно ограничить размер файловой системы (используются блочные loop-устройства);
  • Скрипт для установки и настройки программного обеспечения внутри контейнера.

Важно! Скрипт работает только от имени привилегированного пользователя (root), работа с контейнерами от имени обычного пользователя не поддерживается.

Работа программы была отлажена и протестирована под Debian Stretch (9) GNU/Linux, архитектура amd64.

Структура проекта

Программа состоит из двух основных файлов с кодом на Python и конфигурационного файла, рядом с ними же находится директория с шаблонами.

* [templates]    - директория с шаблонами
    + [name1]           - директория шаблона с именем 'name1'
        + config.ini    - файл настроек шаблона
        + install.sh    - sh-скрипт, установка и настройка ПО внутри контейнера
        + README        - информация о шаблоне и его использованию, полезности
    + ...
* config.ini     - конфигурационный файл менеджера
* lxc_builder.py - класс для работы с LXC
* lxc_manager.py - консольный интерактивный менеджер для LXC

Исходный код программы простой, его с легкостью можно переделать или дополнить нужным функционалом.

Шаблоны

Система шаблонов - это иерархия из директорий, в которых хранятся файлы с настройками и командами для подготовки и сборки контейнеров с соответствующим набором программ и служб.

Список шаблонов по умолчанию и их характеристики:

  • alpine-edge - шаблон с чистой установкой Alpine GNU/Linux (amd64) последней версии, 512M ОЗУ;
  • centos-7 - шаблон с чистой установкой CentOS 7 (amd64), 1024M ОЗУ;
  • debian-8 - шаблон с чистой установкой Debian 8 (amd64), 1024M ОЗУ;
  • debian-8-LAMP - Debian 8 (amd64) с настроенной связкой Apache 2.4 + PHP 5.6 + MySQL 5.5 (файловая система - 700М, ОЗУ - 512М);
  • debian-9 - шаблон с чистой установкой Debian 9 (amd64), 1024M ОЗУ;
  • debian-9-i2p - Debian 9 (amd64) с настроенным демоном I2Pd (файловая система - 512М, ОЗУ - 256М);
  • debian-9-tor-privoxy - Debian 9 (amd64) с настроенной связкой TOR + Privoxy (файловая система - 512М, ОЗУ - 256М);
  • ubuntu-14 - шаблон с чистой установкой Ubuntu 14 (trusty, amd64), 1024M ОЗУ;
  • ubuntu-16 - шаблон с чистой установкой Ubuntu 16 (xenial, amd64), 1024M ОЗУ.

Все шаблоны с чистой установкой ОС настроены без ограничения размера файловой системы. Ниже будет рассказано о том, как при необходимости это можно исправить.

Свой шаблон можно создать с нуля или же скопировав за основу один из уже имеющихся. Для этого нужно в директории 'templates' создать новую папку с названием шаблона (желательно в формате "ОС-версия-назначение-программы") и поместить в нее три файла:

  • config.ini- настройки операционной системы, ограничения ресурсов;
  • install.sh - скрипт, написанный на SH для автоматического выполнения внутри контейнера после его создания с помощью LXCBuilder;
  • README - информационный файл, описание и назначение контейнера, полезные заметки и ресурсы.

Файл config.ini содержит две секции с настройками - General и LXC_options.

Назначение опций в секции General:

  • dist - указывается дистрибутив ОС, которая будет взята за основу при построении контейнера, например: debian, ubuntu, alpine, centos и т.п.;
  • release - релиз ОС для выбранного дистрибутива, например: wheezy, jessie, stretch (для debian), edge (для alpine), trusty, xenial (для ubuntu);
  • arch - архитектура выбранной ОС, например: i386, amd64;
  • rootfs_size - ограничение размера корневой файловой системы для контейнера, например: 256M, 800M, 2G, 25G.

При указании для опции 'rootfs_size' значения отличного от нуля '0' файловая система будет распакована в файл, смонтированный через блочное loop-устройство (виртуальная файловая система).

В случае с нулевым значением этой опции все файлы корневой системы будут распакованы в папку 'rootfs', которая размещена в папке контейнера (рядом с файлом 'config'). Контейнеру будет доступен весь размер свободного места файловой системы, в которой расположена директория хранения контейнеров.

В секции 'LXC_options' содержится много опций и все они повторяют одноименные опции и значения тех, которые возможно задать в файле с настройки для контейнера - 'config'.

Подготовка к использованию

Для запуска и работы с LXCBuilder нужна установленная и настроенная система LXC. О ее установке и настройках, а также опциях для контейнеров вы можете узнать из статьи: Linux контейнеры - установка LXC в Debian GNU/Linux, подробная шпаргалка по командам.

Также потребуется Python 3 со стандартным набором библиотек, установим его:

sudo apt-get update
sudo apt-get install python3

Скачать архив с LXCBuilder v.0.2 - Даташит на микросхему TDA7250 (13 КБ).

Поместит скачанный архив в любую удобную папку и распакуйте его. Внесите изменения в файл настроек config.ini - задайте путь для хранения контейнеров.

Теперь можно пробовать запускать lxc_manager.py из консоли (от имени пользователя root), перейдя в папку с проектом:

python3 lxc_manager.py

Вас должен встретить простой и интуитивно понятный текстовый интерфейс.

Структура меню

Дерево меню программы:

--- LXCBuilder ---
* List & Manage
  + Select container
    + Start
    + Stop
    + Restart
    + Destroy
    + Freeze
    + UnFreeze
    + Console
    + Edit config
    + Generate lxc-* commands list
* Create
* Stop All
* Exit 

После запуска программы к выбору доступны 4 пункта:

  • List & Manage - печатает список доступных контейнеров и предлагает выбрать тот, с которым будем работать, после выбора будет выведено подменю с доступными действиями;
  • Create - создание контейнера, будет предложено ввести название, группу и выбрать шаблон для построения образа;
  • Stop All - остановка всех запущенных контейнеров;
  • Exit - выход;

Несколько скриншотов консоли с рабочим процессом

Для демонстрации работы с консольным менеджером привожу два длинных скриншота. В данном случае контейнеры хранятся в директории, которая размещена в точке монтирования /tmp, которая в свою очередь смонтирована через tmpfs (файловая система в памяти, выделил для нее 5ГБ ОЗУ).

Это позволяет очень быстро развертывать и настраивать контейнеры для временной работы, к тому же нет лишней нагрузки на жесткий диск или SSD.

Если ваша система обладает хорошим объемом ОЗУ и LXC по большей части нужно для целей тестирования и разработки, то такой вариант размещения контейнеров может быть вам очень даже интересен.

Сразу после запуска менеджера в консоли будет отображено основное меню, а также шапка с полезной информацией о системе и настройках хранения контейнеров:

  • OS - указано полное название ОС и версия используемого ядра Linux;
  • SYS - размер оперативной памяти системы и модель ее микропроцессора;
  • LXC version - текущая, установленная в системе версия системы LXC;
  • Store path - полный путь к директории в которой будут храниться контейнеры;
  • Store FS - информация о файловой системе для директории с контейнерами;
  • Conatiners - количество присутствующих контейнеров в заданной директории.

Процесс создания нового контейнера из шаблона в LXCBuilder

Рис. 1. Процесс создания нового контейнера из шаблона в LXCBuilder.

Вот что происходит в данном примере:

  1. Выбираем 'Create' для создания контейнера;
  2. Вводим название контейнера - 'lamp-site1';
  3. Вводим название группы для этого контейнера - 'site';
  4. Выбираем шаблон - 'debian-8-LAMP';
  5. Ждем завершения процесса создания и настройки контейнера;
  6. Смотрим данные по контейнеру (IP, статус, PID...);
  7. Изучаем вывод текста файла README из выбранного шаблона;
  8. Для возвращения в главное меню достаточно нажать ENTER.

Процесс генерации lxc-* команд для выбраненного контейнера а в LXCBuilder

Рис. 2. Процесс генерации lxc-* команд для выбраненного контейнера а в LXCBuilder.

Действия в данном примере:

  1. Выбираем 'List & Manage' для вывода списка доступных контейнеров;
  2. Выбираем контейнер 'testing-proxy';
  3. Изучаем выведенную по нему информацию и статистические данные;
  4. Выбираем действие 'Generate lxc-* commands list' для генерации списка часто используемых lxc-* команд;
  5. Для возврата в главное меню достаточно нажать ENTER.

В завершение

Вот такой получился не сложный и достаточно полезный проект, который экономит мне много полезного времени и ресурсов моего рабочего компьютера.

Думаю что найдется тот, кто читая эту статью захочет задать вопрос в стиле: "А почему не Docker?" - потому что это совсем другой инструмент и с другими возможностями, ориентированный на изоляцию отдельных приложений (микросервисов) и последующую их связку, при необходимости.

В доккере нет системы INIT для запуска и управления множеством процессов, хотя и из этой ситуации можно частично выкрутиться, к примеру использовав функционал одной из программ-супервайзеров в GNU/Linux, вот некоторые из таких пакетов:

  • 'runit' - system-wide service supervision;
  • 'supervisor' - System for controlling process state.

В отличие от Docker-контейнера, LXC-контейнер содержит полноценную среду операционной системы GNU/Linux, в которой можно развернуть и настроить одновременно множество разных служб и приложений, без всяких 'хаков' и сторонних супервайзеров процессов - это просто, удобно и доступно прямо из коробки GNU/Linux, как говорится: "Батарейки уже в комплекте!".

Успешной контейнеризации!

0 247 Python