Stupid House

Мониторинг удаленной системы в Home Assistant


home assistant мониторинг systemmonitor

Настраивая мониторинг локальной системы в 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://host_ip_address: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. В открывшемся окне вводим понятное имя отслеживаемого хоста, его адрес, данные для доступа.

integration glances to home assistant

 

После успешного подключения, можем добавлять необходимые сенсоры на панель Lovelace.

мониторинг удаленной системы в Home Assistant

Датчики 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 для доставки уведомлений и управления умным домом

Автор: muxa, 24.11.2020
Войдите или зарегистрируйтесь, чтобы иметь возможность оставлять комментарии