Мониторинг удаленной системы в Home Assistant
Настраивая мониторинг локальной системы в Home Assistant сразу появилась мысль настроить мониторинг и удаленных систем. Полистав список интеграций наткнулся на компонент Glances, позволяющий отображать статистику удаленных машин в Home Assistant с помощью Glances API. Понятно, что для мониторинга есть специальные комплексные системы, такие как Zabbix, но для домашнего использования, с минимально необходимым набором, разворачивать их не имеет смысла, достаточно того функционала, который может предложить Home Assistant.
Glances - кроссплатформенная утилита системного мониторинга. Позволяет отслеживать состояние системы непосредственно на самом компьютере или удаленно. Для удаленного мониторинга имеет режим сервера, подключение происходит этой же утилитой в режиме клиента, или режим Web сервера, подключение происходит при помощи Web браузера. Доступная версия Glances на момент написания статьи была 3.1.5. Документацию можно почитать здесь.
Установка Glances в ОС Debian, Ubuntu, Raspberry Pi OS
# apt-get install glances
Установка Glances в ОС CentOS 7/8
Установка для CentOS 7. Для седьмой CentOS в репозиториях последняя доступная версия 2.5.1, поэтому ставить будем через менеджер пакетов pip
, предварительно установив Python3.
# yum install python3 python3-devel python3-pip gcc # pip3 install glances
Установка для CentOS 8:
# dnf install glances
Установка Glances в ОС FreeBSD
Установка из коллекции портов:
# cd /usr/ports/sysutils/py-glances/ && make install clean
Для приверженцев установки из пакетов:
# pkg install py37-glances
Первый запуск Glances
Home Assistant взаимодействует с Glances через Web API, запуск программы в режиме Web сервера выглядит так:
# glances -w
Если после запуска появляется сообщение: Bottle module not found. Glances cannot start in web server mode, то выполняем:
# pip3 install bottle
Если менеджер pip
не установлен, то устанавливаем его:
Для Debian, Ubuntu, Raspberry Pi OS:
# apt-get install python3-pip
Для CentOS 7:
# yum install python3-pip
Для CentOS 8:
# dnf install python3-pip
Для FreeBSD:
Установка из коллекции портов:
# cd /usr/ports/devel/py-pip && make install clean
С помощью менеджера пакетов:
# pkg install py37-pip
возможно вместо файла pip3 будет файл pip:
# pip install bottle
По необходимости повторяем запуск в режиме Web сервера. Далее заходим в браузере и проверяем:
http://<strong>host_ip_address</strong>:61208
При успешном подключении закрываем программу:
Ctrl+C
Установка доступа по паролю
По умолчанию вход в Web интерфейс свободный, для защиты паролем необходимо запустить программу с ключом --password
, при запуске будет запрошен новый пароль для доступа пользователя по умолчанию glances
. После задания пароля будет предложено сохранить его в файл [login].pwd
. При сохраненном пароле в файл и повторном запуске с ключом --password
, запроса на ввод пароля не будет, данные будут браться из сохраненного файла.
Для доступа под отдельным пользователем используется ключ --username
. Сначала запрашивается имя пользователя, которому будет разрешен доступ, затем пароль и запрос на сохранение в файл. Файлы с паролями хранятся в зашифрованном виде в каталоге ~/.config/glances/
.
Создадим пользователя homeassistant
для доступа к Web интерфейсу.
# glances -w --username
При запуске будет предложено ввести имя пользователя, пароль и запрос на сохранение данных в файл. Сохраняем, далее будем использовать эти данные для последующего запуска и доступа Home Assistant.
Define the Glances webserver username: homeassistant Define the Glances webserver password (homeassistant username): Password (confirm): Do you want to save the password? [Yes/No]: yes Glances Web User Interface started on http://0.0.0.0:61208/
Пробуем зайти через Web браузер под созданным пользователем после чего закрываем запущенную программу:
Ctrl+C
Запуск Glances как сервиса в Debian, Ubuntu, Raspberry Pi OS, CentOS
Создаем файл для запуска сервиса при старте системы:
# nano /etc/systemd/system/glances.service
Заполняем созданный файл.
Для CentOS 7:
[Unit] Description=Glances After=network.target [Service] ExecStart=/usr/local/bin/glances -w -u homeassistant Restart=on-abort RemainAfterExit=yes [Install] WantedBy=multi-user.target
Для Debian, Ubuntu, Raspberry Pi OS, CentOS 8:
[Unit] Description=Glances After=network.target [Service] ExecStart=/usr/bin/glances -w -u homeassistant Restart=on-abort RemainAfterExit=yes [Install] WantedBy=multi-user.target
Запускаем сервис:
# systemctl --system daemon-reload # systemctl enable glances.service # systemctl start glances.service
Запуск Glances как сервиса в OS FreeBSD
Разработчики glances обошли стороной запуск сервиса в FreeBSD, при запуске от системного пользователя каталог ~/.config/glances/
будет уже /.config/glances/
, при таком пути файл с паролем пользователя найден не будет и сервис не запустится. Для решения этой проблемы разместим файлы с паролями в папке /usr/local/etc/glances/
, в которой может располагаться не обязательный конфигурационный файл glances.conf
, а каталог ~/.config/glances/
сделаем как Symlink на /usr/local/etc/glances
/. Так же в корневом каталоге создадим папку /.config
/ с Symlink на каталог /usr/local/etc/glances/
.
Создаем каталог /usr/local/etc/glances/
и перемещаем в него созданный файл с паролем для пользователя homeassistan.
# mkdir /usr/local/etc/glances # chmod 755 /usr/local/etc/glances/ # mv ~/.config/glances/homeassistant.pwd /usr/local/etc/glances/
Удаляем каталог ~/.config/glances/ и делаем Symlink на /usr/local/etc/glances/
.
# rm -d -f -R ~/.config/glances/ # ln -s /usr/local/etc/glances ~/.config/glances
Создаем в корне папку /.config
, а в ней Symlink на каталог /usr/local/etc/glances
/.
# mkdir /.config # ln -s /usr/local/etc/glances /.config/glances
Создаем скрипт запуска при старте системы:
# touch /usr/local/etc/rc.d/glances # chmod 755 /usr/local/etc/rc.d/glances
Заполняем созданный файл:
#!/bin/sh # PROVIDE: glances # REQUIRE: LOGIN # KEYWORD: shutdown . /etc/rc.subr name="glances" rcvar=${name}_enable pidfile_child="/var/run/${name}.pid" pidfile="/var/run/${name}_daemon.pid" logfile="/var/log/${name}.log" load_rc_config $name : ${glances_enable:="NO"} command="/usr/sbin/daemon" start_precmd="${name}_prestart" glances_prestart() { rc_flags="-f -o ${logfile} -P ${pidfile} -p ${pidfile_child} /usr/local/bin/${name} ${rc_flags}" } start_postcmd=${name}_poststart glances_poststart() { sleep 1 run_rc_command status } run_rc_command "$1"
Добавляем скрипт в автозапуск, в качестве параметров указываем тип запуска -w
и доступ созданному пользователю homeassistant
, стартуем сервис:
# sysrc glances_enable="YES" # sysrc sysrc glances_flags="-w -u homeassistant" # service glances start
В при успешном запуске должны получить такой результат:
Starting glances. glances is running as pid 6800.
Если с запуском какие проблемы, то изучаем логи /tmp/glances-[user].log
и /var/log/glances.log
.
Добавление датчиков в Home Assistant
Для Glances в Home Assistant есть свой модуль интеграции, добавляется в Configuration -> Integrations -> +
, в списке находим Glances
. В открывшемся окне вводим понятное имя отслеживаемого хоста, его адрес, данные для доступа.
После успешного подключения, можем добавлять необходимые сенсоры на панель Lovelace.
Датчики Glances доступные в Home Assistant:
- Текущая загрузка процессора в процентах.
- Среднее значение загрузки системы (Load Average) за 15 минут.
- Текущий размер использованной оперативной памяти в процентном показателе.
- Количество использованной оперативной памяти.
- Количество свободной оперативной памяти.
- Текущий размер использованного дискового пространства в процентном показателе. Для каждого смонтированного раздела свой сенсор.
- Количество использованного дискового пространства. Для каждого смонтированного раздела свой сенсор.
- Количество свободного дискового пространства. Для каждого смонтированного раздела свой сенсор.
- Текущий размер использованного пространства раздела Swap в процентном показателе.
- Количество использованного пространства раздела Swap.
- Количество свободного пространства раздела Swap.
- Информация по процессам. Общее количество процессов, количество работающих, спящих.
- Информация о температуре. Для каждого доступного датчика в glances создается отдельный сенсор, например, можно смотреть температуру каждого ядра процессора.
- Информация по контейнерам Docker.
На данный момент нельзя получить информацию по сетевым интерфейсам и трафику на них, нет информации о Load Average за 1 и 5 минут. Glances умеет показывать информацию о загрузке каждого ядра, информацию о состоянии жесткого диска (SMART) и RAID массива, к сожалению данная информация так же не доступна в Home Assistant.
Информация об интеграции Glances описана в документации на сайте Home Assistant.
Безопасность
К сожалению уровень безопасности ограничивается только доступом по паролю. Программа не умеет использовать шифрованный трафик, для использования шифрования на основе сертификатов предлагается использовать реверс прокси, например, nginx. Нельзя задать конкретные интерфейсы, на которых будет осуществлен доступ к программе. Если для мониторинга систем в домашней локальной сети это не проблема, то для ограничения доступа в крупных сетях лучше использовать Firewall, шифрованные VPN туннели и реверс прокси с шифрованием с использованием сертификатов.
Автоматизация
Как получать уведомления о заканчивающемся месте на диске было описано в статье Мониторинг локальной системы в Home Assistant.
Сейчас рассмотрим оповещение при повышении температуры процессора более 60°C. Добавляем в файл automations.yaml
.
- id: 'system_monitor_server01_hight_cpu_temp' alias: System Monitor - server01 - Hight CPU Temperature trigger: - platform: numeric_state entity_id: sensor.server01_package_id_0_temp above: '60' condition: [] action: - service: persistent_notification.create data: title: ⚠ - Warning! message: Server01 - CPU Temperature > 60° - service: telegram_bot.send_message data: message: ⚠ - Server01 - CPU Temperature > 60° mode: single
На сервере стоит процессор с четырьмя ядрами и в Home Assistant можно посмотреть температуру на каждом ядре, сенсор server01_package_id_0_temp показывает "как бы" общую, но по факту она совпадает с температурой на первом ядре.
Следующая автоматизация будет уведомлять о недоступности удаленного сервера. Принцип такой: проверяется доступность сенсора загрузки процессора, если он перешел в состояние unavailable
, то система будет считаться недоступной, о чем будет отослано уведомление. Минус данной реализации в том, что если упадет только сервис Glances, то автоматизация будет считать, что недоступна вся система в целом, но думаю, что в 99% случаев отказ будет всей системы.
- id: 'system_monitor_server01_host_unavailable' alias: System Monitor - Server01 - Host unavailable trigger: - platform: state entity_id: sensor.server01_cpu_used to: unavailable condition: [] action: - service: persistent_notification.create data: title: ? - Critical Error! message: Server01 - не доступен. - service: telegram_bot.send_message data: message: ? - Server01 - не доступен. mode: single
Настройка отправки уведомлений в Telegram рассмотрено в статье: Подключение Telegram bot к Home Assistant для доставки уведомлений и управления умным домом