Реализация простой HTML5-панели управления серверами с поддержкой IPMI

от автора

Для удаленного доступа к физическим серверам клиенты хостеров используют программные средства, которые работают только при наличии операционной системы и специального софта.

Если система не установлена или возникли какие-то проблемы с ее настройкой (например, при попытке изменить правила межсетевого экрана), доступ можно потерять. В таких ситуациях на помощь приходят специализированные контроллеры, позволяющие управлять серверами без ОС, как если бы вы сидели за физической консолью. Рассказываем, как это работает у нас в HOSTKEY.

Проблемы традиционных решений

Обычным методом организации удаленного доступа к арендованным серверам считается управление на основе IPMI* — запуск Java-плагина KVM. 

* IPMI — интеллектуальный интерфейс управления платформой (отраслевой стандарт).

Для доступа к консоли нашим клиентам приходилось выполнять множество действий: активировать подключение, ждать, пока система выполнит проброс серого адреса, создавать временную учетную запись, переходить по ссылке с IP-адресом, авторизоваться в веб-интерфейсе и использовать интегрированный в сервер модуль IPMI.

 

На клиентском устройстве требовалось установить программное обеспечение Java, что часто приводило к повышенной нагрузке на службу поддержки: не всем пользователям удавалось запустить скачанную консоль, были проблемы с версиями ПО, с запуском на Мас и т. д. 

Эти недостатки стимулировали нас разработать более удобный и простой в обращении механизм управления оборудованием. Идея довольно очевидна: чтобы клиенту не пришлось устанавливать и настраивать софт, нужно сделать все на стороне хостера в безопасном виртуальном окружении. 

Мы создали HOSTKEY INVAPI — сервисную панель, позволяющую выполнять любые действия по управлению оборудованием: от заказа серверов до переустановки ОС. Панель реализована в виде одностраничного веб-приложения, а все ее функции доступны также через API. Действия пользователя и запросы к API можно отслеживать в браузере через консоль разработчика (вызывается по Ctrl + Shift + I). Это позволяет анализировать все вызовы для отладки интеграции. Более подробно о концепции Invapi и процессе ее создания мы расскажем в отдельной статье. 

Внутреннее устройство INVAPI

Чтобы избавить пользователей от лишних телодвижений, мы реализовали прямой вызов веб-консоли HTML5 из личного кабинета без локальной установки Java. Для практического воплощения идеи был использован Docker, а в основу решения легли сборки NoJava-IPMI-KVM-Server и ipmi-kvm-docker. Панель поддерживает материнские платы Supermicro до поколения 10X включительно, поскольку одиннадцатое поколение уже оснащено средством просмотра HTML5 Supermicro iKVM/IPMI.

Для доступа к консоли пользователю достаточно нажать кнопку:

Активировать консоль также возможно с помощью запроса напрямую к API:

curl -s "https://invapi.hostkey.com/eq.php" -X POST \ --data "action=novnc" \ --data "token=SESSION_TOKEN" \ --data "id=SERVER_ID" \ --data "pin=PIN_CODE"

Пример ответа:

{ "result":"OK", "scope":"http://rcnl1.hostkey.com:32800/vnc.html?host=IP ХОСТА&port=32800&autoconnect=true&password=YVhMxxhiuTpe3mH6y3ry", "context":{"action":"novnc","id":"25250","location":"NL"}, "debug":"debug", "key":"71ccb18b1fa499458526acc15fb6a40b" }

Остается дождаться загрузки консоли — и можно работать, хотя внутреннее устройство процесса получения доступа выглядит сложнее. Для примера рассмотрим вызов HTML5-консоли для сервера с IPMI.

Общая схема вызова веб-консоли HTML5 из личного кабинета клиента:

При запросе через INVAPI дается команда в API на открытие консоли для определенного сервера через кластер брокера сообщений (RabbitMQ). Для вызова консоли достаточно передать в брокер сообщений IP-адрес сервера и его локацию (наши серверы расположены в Нидерландах, США и России).

RabbitMQ передает данные сервера и задачу на открытие консоли созданному нашими специалистами вспомогательному сервису-ресиверу. Ресивер забирает данные, преобразует всю необходимую информацию, разделяет задачи (например, Cisco, IPMI и т. д.) и направляет их агентам. 

Агенты (fence agents) соответствуют типам используемого в нашей инфраструктуре оборудования. Они обращаются на сервер с Docker-novnc, у которого есть доступ в закрытую сеть IPMI. Агент передает на сервер с Docker-novnc GET-запрос, в котором содержится IP-адрес и ID сервера, сессионный токен, а также ссылка на закрытие сеанса.

Структура запроса:

http://rcnl1.hostkey.com:ПОРТ/api/v1/server/IP_СЕРВЕРА/skey/КЛЮЧ_ЗАПРОСА/ID_СЕРВЕРА/closeurl/ССЫЛКА_НА_ЗАКРЫТИЕ

Содержание контейнера:

  • Xvfb — X11 в виртуальном фрейм-буфере;

  • x11vnc — сервер VNC, который очищает указанный сервер X11;

  • noNVC — просмотрщик VNC на HTML5;

  • Fluxbox — оконный менеджер;

  • Firefox — браузер для просмотра консолей IPMI;

  • Java-плагин — Java требуется для доступа к большинству консолей IPMI KVM.

NoJava-IPMI-KVM-Server — это сервер на основе Python, позволяющий централизованно предоставлять sciapp/nojava-ipmi-kvm через браузер. Решение не требует установки Java или nojava-ipmi-kvm на локальных устройствах.

Ссылка для автоматического завершения сеанса добавлена нами для удобства пользователя и обеспечения безопасности оборудования: при отсутствии активности в течение определенного времени консоль будет закрыта автоматически. Этот вызов стартует сервис, запускающий контейнер с Docker-novnc, в котором содержится внешний IP-адрес для открытия консоли. Полное описание сборки и процесса установки контейнера NoJava-IPMI-KVM можно найти на GitHub.

Пример конфигурационного файла (~/.nojava-ipmi-kvmrc.yaml):

templates:   kvm-openjdk-7u51:     skip_login: False     login_user: ADMIN     login_endpoint: rpc/WEBSES/create.asp     allow_insecure_ssl: False     user_login_attribute_name: WEBVAR_USERNAME     password_login_attribute_name: WEBVAR_PASSWORD     send_post_data_as_json: False     session_cookie_key: SessionCookie     download_endpoint: Java/jviewer.jnlp     java_version: 7u51     format_jnlp: False

Запуск контейнера Docker:

usr/bin/nojava-ipmi-kvm -i 10.77.21.239 -u ADMIN -p PASSWD mykvmhost [INFO] Check if 'http://10.77.21.239/' is reachable... [INFO] The url 'http://10.77.21.239/' is reachable. [INFO] Starting the Docker container... [INFO] Waiting for the Docker container to be up and ready... [INFO] Docker container is up and running. [INFO] Url to view kvm console: http://IP_SERV:ID_SERV/vnc.html?host=IP_SERV&port=32769&autoconnect=true&password=PASSWD http://IP_SERV:ID_SERV/vnc.html?host=IP_SERV&port=ID_SERV&autoconnect=true&password=PASSWD

Скрипт для запуска сервиса:

#/bin/python3 # EASY-Install-Entry_Script: 'nojava-ipmi-kvm==0.9.0', 'console_scripts', 'nojava-ipmi-kvm' __requires__ = 'nojava-ipmi-kvm==0.9.0' import re import sys from pkg_resources import load_entry_point  if __name__ == ' __main__ ':     sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])     sys.exit(         load_entry_point('nojava-ipmi-kvm==0.9.0', 'console_scripts', 'nojava-ipmi-kvm')()     )

Итоги

Внедрение нового решения значительно упростило для конечных пользователей процесс управления оборудованием Supermicro, а также снизило нагрузку на нашу службу поддержки. Для серверов с доступом по протоколу VNC мы реализовали консоль HTML5 с помощью Apache Guacamole, что также позволило упростить управление «железом» других производителей.

____________________________________

Кстати, в нашей панели управления серверами HOSTKEY кроме описанных возможностей планируется расширение функциональности. Если вас интересуют дополнительные функции и особенности работы панели или нашего API – пишите в комментариях.


ссылка на оригинал статьи https://habr.com/ru/company/hostkey/blog/661271/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *