Docker контейнер для управления HP серверами через ILO

Вы наверное может задаться вопросом — а здесь то Docker зачем? В чем проблема зайти на веб интерфейс ILO и настроить свой сервер как надо?
Так и я думал когда мне отдали пару старых ненужных серверов, которые мне надо было переустановить (то что называется reprovision). Сами сервер находятся за океаном, единственное что доступно это веб интерфейс. Ну и соответственно мне надо было зайти в Virtual Console для выполнения некоторых команд. Тут и началось.
Как известно для разного рода виртуальных консолей обычно используется Java, что в HP, что в Dell. Во всяком случае раньше так точно (а системы очень старые). Но Firefox и Chrome давно уже перестали поддерживать эти апплеты, да и не работает новый IcedTea с этими системами. Поэтому обозначилось несколько вариантов:

1. Начать конструировать зоопарк из браузеров и Java версий на своей машине, этот вариант отпал сразу. Никакого желания издеваться над системой ради пары команд нет.
2. Запустить на виртуалке что-нибудь достаточно старое (опытным путем выяснилось что нужна Java 6) и через него сконфигурировать все что нужно.
3. То же самое что и пункт 2, только в контейнере, так как с той же проблемой столкнулись несколько коллег и гораздо легче передать им ссылку на контейнер на dockerhub, чем образ виртуалки, со всеми паролями и т.д.
(На самом деле до пункта 3 я дошел только после того как сделал пункт 2)
Пункт 3 мы и сделаем сегодня.

Я вдохновлялся в основном двумя проектами:
1. docker-baseimage-gui
2. docker-firefox-java
В принципе первый проект docker-baseimage-gui уже содержит утилиты и конфигурации для запуска десктопных приложений в докере. Обычно вам нужно определить стандартные переменные и ваше приложение будет доступно через браузер (websocket) или VNC. В нашем случае мы будет запускать через Firefox и VNC, через websocket не получилось.
Сначала установим нужные пакеты — Java 6 и IcedTea:

RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list &&
apt-get update &&
apt-get -y upgrade &&
apt-get -y install firefox
nano curl
icedtea-6-plugin
icedtea-netx
openjdk-6-jre
openjdk-6-jre-headless
tzdata-java

Теперь осталось зайти на страницу ILO интерфейса и вбить свой логин и пароль. Запускаем Firefox в автостарте:

RUN bash -c 'echo "exec openbox-session &" >> ~/.xinitrc' &&
bash -c 'echo "firefox ${HILO_HOST}">> ~/.xinitrc' &&
bash -c 'chmod 755 ~/.xinitrc'

Переменная окружения HILO_HOST содержит веб адрес нашего ILO интерфейса, например myhp.example.com
Для автоматизации входа давайте прикрутим авторизацию. Логин в ILO происходит обычным POST запросом, в результате которого получаете JSON session_key, который потом передаете в GET запросе:
Вычислим session_key через curl, если определены переменные окружения HILO_USER и HILO_PASS:

export HOME=/config
export HILO_HOST=${HILO_HOST%%/}
SESSION_KEY=""
data="{"method":"login","user_login":"${HILO_USER}","password":"${HILO_PASS}"}"
if [[ -n "${HILO_USER}" && -n "${HILO_PASS}" ]]; then
    SESSION_KEY=$(curl -k -X POST "${HILO_HOST}/json/login_session" -d "$data" 2>/dev/null | grep -Eo '"session_key":"[^"]+' | sed 's/"session_key":"//')
fi
echo "SESSION_KEY=$SESSION_KEY"
echo $SESSION_KEY > /session_key

После того как мы записали session_key в докере, можно запускать VNC:

exec x11vnc -forever -create

Теперь просто соединяемся по VNC к порту 5900 (или любому другому по вашему выбору) на localhost и заходим в виртуальную консоль.
Весь код находится в репозитории docker-ilo-client.
Полная команда для подключения к ILO:

docker run -d --rm --name ilo-client -p 5900:5900 -e HILO_HOST=https://ADDRESS_OF_YOUR_HOST -e HILO_USER=SOME_USERNAME -e HILO_PASS=SOME_PASSWORD sshnaidm/docker-ilo-client

где ADDRESS_OF_YOUR_HOST это имя хоста ILO, SOME_USERNAME — логин и соответственно SOME_PASSWORD пароль к ILO.
После этого просто запускаете любой VNC клиент на адрес: vnc://localhost:5900
Дополнения и пулл реквесты, конечно, приветствуются.

Похожий проект существует для соединения к IDRAC интерфейсам DELL машин: docker-idrac6.

Источник: habr.com