Здравствуйте, меня зовут Павел.
Я работал системным администратором с 2010 года в разных компаниях, в 2019 году решил сменить сферу деятельности на DevOps‑инженера.
Проработав некоторое время DevOps‑инженером, понял, что сотрудникам нужна программа, которая создавала бы в виде таблицы ёмкие отчёты о том, какие версии сборки программы установлены, на каких тестовых стендах и в каком состоянии эти сборки находятся на момент составления отчёта, с учётом того, что их можно было бы рассылать по email команде разработчиков.
Работая в компании, этот вариант отчёта я создал в виде джобы в Jenkins (Pipeline + Bash), отчёт создавался только для определённых тестовых стендов и для определённой программы.
Через некоторое время появилась мысль создать свою универсальную кроссплатформенную программу на Java для простого создания DevOps‑отчётов.
Для профессии DevOps‑инженера нужно было знать Java. Написание своей программы было бы неким стимулом для его изучения, поэтому я решил приступить к учёбе и по возможности создавать свою программу.
Почитав на просторах интернета статьи о лицензировании при использовании JDK и Open JDK, чтобы не было проблем с авторскими правами, я принял решение использовать Open JDK Amazon Corretto 11.
В качестве GUI интерфейса выбрал JavaFX.
Программу назвал «DevOps Report Manager».
Далее, вооружившись книгой «Java Руководство для начинающих» и Интернетом, начал создавать первую часть программы.
Первая часть программы, которая строит отчёты по содержанию веб программного контекста у программ
Для простоты установки программы было принято решение не использовать базы данных, а хранить настройки в зашифрованном виде в текстовом файле.
Настройки активации полной версии программы (без ограничений по количеству серверов) решил хранить в отдельном зашифрованном файле для простоты использования в корпоративной среде.
В качестве алгоритма шифрования использовал AES 256.
Минимальную длину пароля установил в 4 символа, максимальную — в 256 символов.
Все файлы настроек, логов и отчётов программы решил хранить в домашней директории пользователя в папке DevOps Report Manager files и соответствующих подпапках Settings, Logs, Reports.
Логи реализовал с помощью Logger, подумал, что для этой программы не нужно хранить много файлов, сделал так, чтобы логи хранились в одном файле и чтобы он заменялся по достижении примерно 7 МБ.
Сделал, чтобы файл определённого вида отчёта заменялся каждый раз, когда создаётся данный отчёт.
Так же в программе есть некая защита от «дурака», выглядящая как некоторые ограничения по количеству знаков для заполнения форм и таблиц.
Через несколько месяцев первая часть программы была создана.
Программа строила отчёты в виде симпатичной таблицы в едином HTML‑файле для удобства пересылки по почте.
В HTML‑файле присутствует JavaScript для работы интерактивной таблицы отчёта.
Также в программе присутствовал вариант отчёта в формате EML (в полном и сокращённом виде).
В EML‑формате отчёт менее красивый, потому что используется HTML version 1.0, который накладывает свои ограничения на оформление страниц.
Отчёт создаётся, если у программы есть web программный контекст в HTML‑ или Json‑формате примерно такого вида { «programName»: «Test_1», «programVersion»: «1.0.0», «standIP»: «127.0.0.1» } , и если путь до программного контекста был примерно такого вида https://адрес:порт/имя программы/… путь до контекста программы.
В качестве параметров program name и program version нужно использовать соответствующие названия параметров в программном контексте (не значения параметров).
К примеру в контексте «programName»: «Test_1»,
«programName» — это название параметра;
«Test_1» — это значение параметра.
Если в настройках программы указать название несуществующего параметра и создать отчёт, программа в отчёте напишет «check settings».
Ниже представлен скриншот первой части программы (третья вкладка программы).
Ниже представлен анимированный gif-скриншот с вариантом отчёта в HTML-формате (если кликнуть на текст программного контекста, откроется его страница).
Ниже представлен анимированный gif‑скриншот с вариантом полного и сокращённого отчёта в EML‑формате (для простоты навигации по документу создал якорные ссылки).
В процессе создания первой части программы появлялись мысли, что нужно сделать ещё две: для составления отчётов Docker и Kubernetes
Решил, что программа должна работать если Docker не настроен для сбора метрик и если не установлен Kubernetes metrics-server.
Начиная размышлять, каким образом можно собирать данные с серверов, я придумал вариант с разовым подключением к серверу по ssh, выполнением нужного набора команд, копированием всего вывода из консоли в переменную и дальнейшим парсингом текста из переменной с помощью регулярных выражений.
Ниже представлен небольшой пример части команды для Docker
echo "docker_image_ls_start" && docker image ls nginx:latest && echo -e "docker_image_ls_end\n" && history -d -1
echo "docker_image_ls_start" && echo -e "docker_image_ls_end\n" - Вывод текста, по которому регулярное выражение определяет, где начало и где конец определённой информации, которую нужно в дальнейшем обработать в программе.
docker image ls nginx:latest - Здесь "nginx":"latest" в коде программы заменяются на переменные, которые берут значения из массива данных таблицы JavaFX.
history -d -1 - Чтобы не засорять историю командной строки, выполняется очистка истории CLI от последней выполненной команды.
В дальнейшем в некоторых отчётах, если много контейнеров или подов, пришлось сделать так, чтобы программа могла подключаться к серверу два раза.
Для подключения к серверам по SSH решил использовать открытую библиотеку SSH клиента JSch.
Для подключения по SSH есть возможность использовать User и Password, использовать SSH key в формате PEM, использовать SSH key в формате PEM и SSH key Password.
Для некой безопасности чтения полей user и ssh key in pem format сделал их блокировку по паролю.
Для составления отчётов добавил возможность выполнения команд с правами Sudo.
В данных частях программы значительно усложняется алгоритм вывода в таблицу данных, потому что контейнеров и подов значительно больше, чем один, и у каждого может быть своё состояние.
Для Docker-контейнеров было принято решение создать следующие примерные виды состояний:
Для Kubernetes-подов было принято решение создать следующие примерные виды состояний:
Если же появляется 3 или больше разных состояний контейнера или пода, тогда общий статус выбирается в сторону «больших ошибок».
В любом случае нужно смотреть подробное техническое описание в таблице отчёта.
Вторая часть программы для создания отчётов Docker
К сожалению, у Docker я не нашёл команд для расширенных отчётов по контейнерам (docker inspect не то), к примеру, как по подам у Kubernetes, поэтому в качестве дополнительной технической информации в отчётах Docker в программе используется информация по статам контейнеров и о сервере Docker.
Ниже представлен анимированный gif-скриншот с переключением интерфейса с Docker Image отчётов на Docker Compose отчёты.
Вторая часть программы состоит из двух частей:
Генерация отчётов Docker создаёт отчёт о состоянии контейнеров Docker по названию Image name и по названию Image tag.
Ниже представлен анимированный gif-скриншот с вариантом отчёта в HTML-формате.
Ниже представлен анимированный gif-скриншот с вариантом полного и сокращённого отчёта в EML-формате (для простоты навигации по документу создал якорные ссылки).
Генерация отчётов Docker Compose создаёт отчёт о состоянии Docker project по названию Project name.
Ниже представлен анимированный gif-скриншот с вариантом отчёта в HTML-формате.
Ниже представлен анимированный gif-скриншот с вариантом полного и сокращённого отчёта в EML-формате (для простоты навигации по документу создал якорные ссылки).
Третья часть программы для создания отчётов Kubernetes
В качестве дополнительной информации по Kubernetes в зависимости от вида отчёта в моей программе присутствуют такие данные, как:
подробная информация о поде;
подробная информация о деплойменте;
информация о сервисах;
информация о ингресс‑контроллерах;
подробная информация о нодах кластера.
Ниже представлен анимированный gif‑скриншот с переключением интерфейса с Kubernetes Image отчётов на Kubernetes Applications отчёты.
Третья часть программы состоит также из двух частей:
Генерация отчётов Kubernetes создаёт отчёт о состоянии подов Kubernetes по названию Image name, названию Image tag и Namespace.
Ниже представлен анимированный gif‑скриншот с вариантом отчёта в HTML‑формате.
Ниже представлен анимированный gif-скриншот с вариантом полного и сокращённого отчёта в EML-формате (для простоты навигации по документу создал якорные ссылки).
Генерация отчётов Kubernetes Application создаёт отчёт о состоянии подов Kubernetes по названию Application name, Application version (необязательный параметр), названию параметра Part‑of (необязательный параметр) и по названию Namespace.
Ниже представлен анимированный gif-скриншот с вариантом отчёта в HTML-формате.
Ниже представлен анимированный gif-скриншот с вариантом полного и сокращённого отчёта в EML-формате (для простоты навигации по документу создал якорные ссылки).
Бэкап, экспорт и импорт файла настроек программы
Для того чтобы можно было делать бэкап файла настроек или делиться файлом настроек программы между сотрудниками без передачи своего пароля, создал возможность сброса пароля при экспорте настроек.
Для загрузки файла экспортируемых настроек нужно будет выполнить его импорт (по завершении импорта файла настроек программа закроется).
Если сотрудник хочет изменить пароль в переданном ему файле настроек, ему нужно будет у себя на компьютере сбросить пароль при экспорте настроек программы и потом импортировать данный файл настроек программы.
Обзор функциональности некоторых кнопок программы
Для просмотра нужного отчёта в нужном формате необходимо выбрать соответствующую вкладку, к примеру Docker report, далее выбрать нужный формат отчёта, к примеру EML, и нажать на кнопку «Open file».
Для сброса настроек в текущей вкладке нужно нажать на кнопку «Reset» и набрать пароль.
Для сброса всех настроек всех вкладок и сброса пароля нужно нажать на кнопку «Reset all» и набрать пароль, затем 2 раза набрать новый.
Для того чтобы сохранить изменения в текущей вкладке, нужно нажать на кнопку «Save» и набрать пароль.
Для того чтобы сохранить изменения настроек на всех вкладках, нужно нажать на кнопку «Save all» и набрать пароль.
Обзор функциональности кнопок закрытия программы
Для проверки изменений настроек программы и запроса на сохранение изменений настроек перед закрытием программы нажмите на кнопку «Exit» или на кнопку «X» в правом верхнем углу окна.
В качестве изменений настроек программы сохраняются положения всех кнопок переключателей во вкладках программы, кроме кнопки переключателя «Block / Unblock» (блокировка и разблокировка видимости полей user и ssh key in pem format).
Сочетание клавиш Alt + F4 показывает диалог о закрытии программы без сохранения изменений настроек.
Итог
В итоге на первую версию программы «DevOps Report Manager» ушло примерно 19 месяцев.
Для некой защиты авторских прав зарегистрировал программу в Роспатенте.
Далее для программы создал сайт.
После создания первой версии программы появились идеи по новой функциональности, поэтому, возможно, позже будет выпущена новая версия.
Всем спасибо.
iwram
Что это? Откуда берет данные и как их агрегирует? На основе каких функций формирует отчёты? Ведь можно привести пару примеров. Видел бакалавровские работы посильнее...
Devops-Report-Manager Автор
Добавил пример в статью.