Некоторое время назад мы научились создавать контейнеры в Linux, используя OpenVZ . Сегодня мы познакомимся с OpenVZ Web Panel. Это приложение, которое позволяет управлять OpenVZ-контейнерами на нескольких физических машинах через веб-интерфейс. Фактически, при помощи OpenVZ и OpenVZ Web Panel вы можете за час работы построить маленький AWS или Google Cloud на собственном железе.

В OpenVZ Web Panel используются ExtJS , SQLite и Ruby on Rails. Притом, как мы скоро убедимся, Ruby-гемы должны быть определенных версий. Поэтому настоятельно рекомендуется поднимать OpenVZ Web Panel прямо внутри OpenVZ контейнера. Или, как вариант, внутри какого-нибудь Docker или Vagrant . Я лично использовал Vagrant с крутящейся внутри него CentOS 6. Вы спросите, откуда такие сложности? Дело в том, что на момент написания этих строк OWP находится как бы в замороженном состоянии. Последний релиз был несколько лет назад, в апреле 2013-го года. Нет, OWP отлично работает и вот это все. Но с установкой приходится немного повозиться.

Установка в теории выглядит так. Нужно скачать скрипт ai.sh и запустить его под рутом, дальше все произойдет автоматически.

Но на практике у меня не установились байндинги к SQLite:

/usr/bin/ruby extconf.rb
mkmf.rb can’t find header files for ruby at /usr/lib/ruby/ruby.h

Исправляем так:

sudo yum install ruby-devel
sudo gem install sqlite3

Теперь получаем другую ошибку:

Building native extensions.  This could take a while…
Successfully installed sqlite3-1.3.11
1 gem installed
Installing ri documentation for sqlite3-1.3.11…
ERROR:  While executing gem … (NoMethodError)
undefined method `map’ for Gem::Specification:Class

Проблема решилась выполнением команды:

sudo gem update —system

После этого пакет sqlite3 успешно установился и скрипт ai.sh смог завершить работу.

Но при запуске OpenVZ Web Panel я увидел:

[FAIL] Unable to start web server.

Поправив немного /etc/init.d/owp, я отключил перенаправление ошибок в /dev/null и увидел настоящую причину ошибки:

undefined method `source_index’ for Gem:Module (NoMethodError)

Решение удалось найти на StackOverfow:

sudo gem update —system 1.8.25

Теперь говорим:

sudo service owp start

Если видим ошибку:

[FAIL] OpenVZ Web Panel is already running.

… говорим:

sudo rm / var / lock / owp

Теперь OWP завелась, но при попытке добавления физических машин через веб-интерфейс я увидел:

Internal error: no such file to load — net/ssh

Исправляем так:

sudo gem install net-ssh -v 2.8.0
sudo gem install net-sftp

Рестартуем OWP и вот теперь все работает!

OpenVZ Web Panel

Можно управлять пулами IP-адресов, создавать и удалять контейнеры, делать бэкапы, клонирование, устанавливать шаблоны и создавать шаблоны из контейнеров, просматривать выполняющиеся в настоящее время задачи, смотреть на используемые ресурсы, управлять пользователями, имеющими доступ к панели, и так далее. Есть еще вкладка Requests — своего рода небольшой встроенный форум и TODO-список. Можно посмотреть на количество свободных ресурсов на физических машинах. Есть возможность создавать ежедневные бэкапы контейнеров. В общем, есть весь необходимый функционал. И в отличие от интерфейса AWS ничего не тормозит!

Наиболее серьезные проблемы, которые мне удалось обнаружить:

  • Бэкапы хранятся на физических машинах вместе с самими контейнерами, собирать бэкапы где-то в другом месте нельзя;
  • Нельзя создать сразу 15 одинаковых контейнеров, только по одному;
  • Миграции контейнеров с одной физической машины на другую не предусмотрено;
  • Bridged сеть не поддерживается — контейнерам можно назначать только статические IP из пула;

Это, конечно, не комбайн на все случаи жизни. Просто маленькая, няшненькая панелька. Как совершенно бесплатное дополнение к CLI очень даже неплохо! Интересно (правда, без трололо), а есть ли что-то подобное для Docker?

<spoiler>О настоящем комбайне я расскажу в одной из следующих заметок. Следите за обновлениями!</spoiler>

Дополнение: Также вас могут заинтересовать заметки Создаем свой маленький IaaS на Parallels Virtual Automation и Мой первый опыт использования Proxmox VE .

EnglishRussianUkrainian