Аренда от собственника. Поднимаем сервис по сдаче в аренду виртуальных FreeBSD-серверовЕвгений «j1m» Зобнин (zobnin@gmail.com) Сегодня мы увидим возможности FreeBSD jail в несколько необычном свете – создадим сервис по сдаче в аренду виртуальных FreeBSD-машин. Он будет полностью автоматизированным, позволит использовать разные версии виртуальных окружений на одной физической машине и обособленные настройки для каждого сервера. И все это - с помощью нескольких простых шелл-скриптов. Один из способов поднять $$$ в кризисное времяВиртуальная FreeBSD-машина – это не что иное, как полнофункциональное jail-окружение, которому выделен глобально маршрутизируемый IP-адрес. Задумка сервиса в том, чтобы раздавать такие окружения на манер номеров в отеле. Клиент заходит на сайт, заполняет необходимые поля формы, переводит чуток WMZ на наш кошелек и получает в ответ IP-адрес своего сервера, домен N-ого уровня и пароль/ключ к ssh-сервису. После чего он волен делать со своим окружением все, что душе заблагорассудится – ровно до того момента, пока не наступит время съезжать, то есть истечет срок аренды, указанный клиентом в одном из полей регистрационной формы. По истечению этого срока сервер останавливается и удаляется. Идея виртуальных отелей далеко не нова и, по сути, представляет собой пример «Облачной обработки данных» (en.wikipedia.org/wiki/Cloud_computing), когда необходимое клиенту программное обеспечение предоставляется как сервис. Чтобы организовать свой бизнес по сдаче в аренду виртуальных FreeBSD-серверов от тебя потребуется наличие N-го количества белых IP-адресов (по одному на каждый виртуальный сервер), домен, закрепленный за одним из них, а также базовое понимание принципов работы FreeBSD. Немного теории, или Сформулируем требованияПользуясь знаниями, почерпнутыми из прошлой моей статьи, организовать сервис не так уж и сложно. Окружения jail подкупают своей простотой и легкостью развертывания: несколько скриптов-обвязок – и дело сделано! Вот только долго такой сервис не протянет. Администраторы начнут плевать в монитор на второй день работы, клиенты завалят жалобами о низкой производительности, а сервер просто загнется, когда количество виртуальных серверов перевалит за первый десяток. Поэтому перед развертыванием и наймом SEO-шников необходимо тщательно продумать будущую инфраструктуру. Для начала сформулируем требования к нашему сервису:
Теперь подумаем об инфраструктуре сервиса и о том, как реализовать все перечисленные требования и оставить задел на будущее, то есть обеспечить возможность добавления новых функций в случае необходимости. После долгих размышлений я пришел к варианту, который не только нагляден и прост, но и достаточно легок в реализации:
Кроме самого FreeBSD-окружения, я поместил в каталог /usr/jailbase еще несколько каталогов и конфигурационных файлов, необходимых для управления виртуальными серверами:
Файл db - база данных для всех виртуальных серверов в формате passwd (поля, разделенные двоеточием). Девятое поле «состояние» предназначено для упрощения администрирования серверов и может принимать следующие значения: none - не существует, disabled - временно отключен, ok - окружение создано и готово к запуску (или уже работает). В свежеустановленной системе, пока еще не существует виртуальных серверов, этот файл исполняет роль базы доступных IP-адресов, когда каждая строка не содержит других полей, кроме первого и девятого (пример: 192.168.0.1::::::::none). Скрипт, создающий новый сервер, просто находит первую строку с состоянием none и заполняет ее (тогда строка принимает примерно такой вид: 192.168.0.1:/usr/jail:ed0:jail.host.com:7.1-RELEASE:vasya@mail.ru:trial:0903031700:ok). В дальнейшем скрипт запуска виртуальных серверов найдет запись с состоянием ok, перейдет в каталог, прописанный во втором поле, найдет каталог нужного окружения по IP-адресу и запустит в нем виртуальный сервер. Собираем все вместеПерво-наперво мы должны создать базовое окружение в каталоге /usr/jailbase/FreeBSD-версия. Для этого переходим в /usr/src и вводим следующую последовательность команд:
В моем распоряжении находится машина с FreeBSD 7.1, поэтому каталог базового окружения получил имя «/usr/jailbase/FreeBSD-7.1-RELEASE». Войдем в окружение и проведем базовую конфигурацию (доменное имя и IP-адрес на данном этапе не имеют значения):
Файл rc.conf не трогаем, он будет генерироваться скриптом addvserver автоматически для каждого виртуального сервера. Пароль суперпользователя не устанавливаем: для окружения будет создаваться пара ключей, и доступ по паролю по умолчанию закрыт. Отредактируем /etc/motd и включим туда всю необходимую информацию о пользовании сервисом:
Выйдем из окружения, набрав exit. Скопируем дерево портов из базовой системы в $JAIL/usr:
Теперь освободим точки монтирования дистфайлов и пакетов от лишнего мусора:
Базовое окружение готово! Конфигурационный файл будет отличаться для каждого окружения, поэтому заботу о его создании мы возложим на плечи скрипта addvserver. Пойдем дальше и добавим каталоги /usr/jailbase/distfiles-версия и /usr/jailbase/packages-версия, которые будут подключаться к окружениям с помощью nullfs:
Затем создадим файл дефолтовых значений для скрипта создания виртуального сервера (addvserver):
Формат базы данных виртуальных серверов я описал выше. Отмечу лишь, что чистая база должна выглядеть как набор записей вида IP::::::::none, по одной записи на каждый доступный внешний IP-адрес. Всю работу по ее заполнению возьмут на себя соответствующие скрипты. Теперь у нас есть все необходимое для создания и манипулирования виртуальными серверами, – осталось только установить и настроить DNS-сервер на физической машине. Он нужен для привязки доменного имени к каждому виртуальному серверу. Мы будем использовать BIND9, поскольку это единственный вменяемый DNS-сервер, позволяющий обновлять зоны, не останавливая работу демона. Пройдем через простые этапы его настройки: 1. Сгенерируем пару ключей, которые необходимы для аутентификации клиента, пожелавшего обновить зоны:
Команда запишет в текущий каталог два файла с именами примерно такого вида – Knsupdate.+157+36521.key и Knsupdate.+157+36521.private. Они понадобятся скриптам addvserver и delvserver для обновления зон, поэтому скопируем их в каталог /usr/jailbase:
Откроем конфиг /etc/namedb/named.conf и запишем в него:
Настроим зоны host.com (локальные уже существуют):
Укажи в них все хосты, имеющие статические имена, и больше эти файлы мы трогать не будем, за нас все сделают скрипты. Запустим bind:
СкриптыЧтобы наш сервис соответствовал всем предъявленным требованиям и функционировал правильно, необходимо написать, как минимум, восемь скриптов:
По-хорошему, первые шесть скриптов лучше объединить в один, принимающий аргументы add, del, start и stop, но для сохранения простоты изложения оставим их в отдельных файлах. Итак, скрипт номер один, addvserver (здесь и далее - только ключевые элементы скриптов; полные версии ты найдешь на прилагаемом к журналу диске):
Скрипт принимает шесть аргументов (доменное имя виртуального сервера, версия ОС, e-mail владельца, тип аккаунта, время истечения срока аренды, файл с публичным ключом клиента) и возвращает IP нового сервера. Скрипт delvserver выполняет обратную процедуру. Сначала он находит сервер в базе db, проверяет, существует ли сервер вообще (статус не должен быть none), а затем выполняет следующую последовательность действий (переменная STRING - это строка сервера из db):
Скрипт disablevserver, предназначенный для временного отключения виртуального сервера, очень похож на delvserver, с тем исключением, что он не удаляет сервер, а просто ставит на него флаг «disabled». То есть, переменная NEWSTRING примет вид: «NEWSTRING=`echo $STRING | sed "/$STATUS/s##disabled#"`». Скрипт enablevserver - брат-близнец disablevserver, единственное отличие которого - установка флага 'ok' вместо 'disabled'. Скрипт startvserver – довольно примитивен. Он ищет переданный ему IP-адрес в базе, проверяет сервер на готовность (статус 'ok') и запускает его. Набор правил номер 4 (ruleset 4) для команды devfs создан специально для jail-окружений и содержится в файле /etc/defaults/devfs.rules. Чтобы скрипт работал корректно, этот файл необходимо положить в /etc.
Скрипт stopvserver перед остановкой проделывает те же шаги и, плюс к этому, проверяет, запущен ли сервер с помощью команды jls – и извлекает его JID (первая колонка вывода jls):
Чтобы не заморачиваться с ручным запуском серверов, напишем скрипт vservers, который проверяет опцию vservers_enable в /etc/rc.conf, запускает все готовые виртуальные серверы во время загрузки ОС и останавливает во время шатдауна. Ключевые строки этого файла:
Вот и все. Рассмотренные скрипты автоматизируют всю грязную работу. Больше не нужно компилировать окружение исполнения, добавлять IP-псевдонимы и редактировать файлы зон! Достаточно выполнить всего две команды, – и виртуальный сервер создан, запущен и полностью готов к использованию:
Остановить и удалить сервер еще проще:
Осталось только нанять веб-разработчиков, которые создали бы поверх этого хозяйства простой интерфейс для регистрации пользователей, и написать небольшой скрипт, который запускался бы по крону и проверял, не истек ли срок аренды аккаунта (пример скрипта ты найдешь на диске). Каркас созданМы создали вполне работоспособный каркас будущего сервиса. В следующей статье мы рассмотрим, как прикрутить к нему полноценный мониторинг, настройки для разных типов аккаунтов, систему бэкапа, наложим всевозможные ограничения и создадим гетерогенную систему, в которой смогут сосуществовать разные версии FreeBSD-окружений. Содержание |