Apcupsd: различия между версиями
Vovan (обсуждение | вклад) (Новая страница: «=Настройка apcupsd на ОС Альт= ==Я точно знаю, что оно должно работать, но не работает. Почему?=…») |
Vovan (обсуждение | вклад) (→Важный параметр, некорректная настройка которого приведёт к непредвиденному выключению сервера!) |
||
(не показано 19 промежуточных версий этого же участника) | |||
Строка 22: | Строка 22: | ||
у пользователя, в зависимости от квалификации и опыта, может уйти от одного дня до ... бесконечности... | у пользователя, в зависимости от квалификации и опыта, может уйти от одного дня до ... бесконечности... | ||
+ | |||
+ | |||
+ | '''Привет, Alt Linux Team :-)''' | ||
+ | |||
+ | ==Как всё сделать как надо?== | ||
+ | |||
+ | ===1. Отключаем сервис, чтобы он больше не занимал порт=== | ||
+ | |||
+ | systemctl stop getty@ttyS0 | ||
+ | systemctl disable getty@ttyS0 | ||
+ | |||
+ | ===2. Поставить apcupsd=== | ||
+ | |||
+ | apt-get update && apt-get install -y apcupsd | ||
+ | |||
+ | ===3. Настроить и включить сервис на порту /dev/ttyS0=== | ||
+ | |||
+ | Конфиг файл | ||
+ | |||
+ | /etc/apcupsd/apcupsd.conf | ||
+ | |||
+ | должен содержать следующие параметры раскомментированными | ||
+ | |||
+ | <pre> | ||
+ | UPSNAME apc | ||
+ | UPSCABLE smart | ||
+ | UPSTYPE apcsmart | ||
+ | DEVICE /dev/ttyS0 | ||
+ | LOCKFILE /var/lock/serial | ||
+ | SCRIPTDIR /etc/apcupsd | ||
+ | PWRFAILDIR /etc/apcupsd | ||
+ | NOLOGINDIR /etc | ||
+ | ONBATTERYDELAY 6 | ||
+ | BATTERYLEVEL 5 | ||
+ | MINUTES 3 | ||
+ | TIMEOUT 0 | ||
+ | ANNOY 300 | ||
+ | ANNOYDELAY 60 | ||
+ | NOLOGON disable | ||
+ | KILLDELAY 0 | ||
+ | NETSERVER on | ||
+ | NISIP 127.0.0.1 | ||
+ | NISPORT 3551 | ||
+ | EVENTSFILE /var/lib/apcupsd/apcupsd.events | ||
+ | EVENTSFILEMAX 10 | ||
+ | UPSCLASS standalone | ||
+ | UPSMODE disable | ||
+ | STATTIME 0 | ||
+ | STATFILE /var/lib/apcupsd/apcupsd.status | ||
+ | LOGSTATS off | ||
+ | DATATIME 0 | ||
+ | </pre> | ||
+ | |||
+ | Включить и запустить сервис | ||
+ | |||
+ | systemctl enable --now apcupsd | ||
+ | |||
+ | ===4. Проверка вручную=== | ||
+ | |||
+ | /sbin/apcaccess | ||
+ | |||
+ | ну и дальше на-grep-пать по вкусу, как это сделано ниже для интеграции с zabbix-агентом... | ||
+ | |||
+ | ==А если хочется в zabbix?== | ||
+ | |||
+ | ===Скачать шаблон и импортировать в свою версию Zabbix=== | ||
+ | |||
+ | Качать [https://github.com/zabbix/community-templates/tree/main/Power_(UPS)/APC/template_apcupsd отсюда] | ||
+ | |||
+ | Далее этот импортированный шаблон нужно добавить на тот хост, на zabbix-agent-е которого настроены дополнительные пользовательские переменные (об этом см. ниже). | ||
+ | |||
+ | А сам процесс настройки пользовательских переменных для zabbix-агента заботливо описан в README.md на github по некоторой ссылке, которая отсутствует в свободном доступе... | ||
+ | |||
+ | ===Настраиваем zabbix-agent=== | ||
+ | |||
+ | Если ещё не установлен: | ||
+ | |||
+ | apt-get update && apt-get install -y zabbix-agent | ||
+ | |||
+ | После установки файл конфигурации агента | ||
+ | |||
+ | /etc/zabbix/zabbix_agentd.conf | ||
+ | |||
+ | нужно привести к виду: | ||
+ | |||
+ | LogFile=/var/log/zabbix/zabbix_agentd.log | ||
+ | Server=%SERVER_ADDR% | ||
+ | Hostname=%ZABBIX_AGENT_HOSTNAME% | ||
+ | Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf | ||
+ | |||
+ | , где | ||
+ | |||
+ | %SERVER_ADDR% | ||
+ | |||
+ | это ip или домен сервера zabbix, а | ||
+ | |||
+ | %ZABBIX_AGENT_HOSTNAME% | ||
+ | |||
+ | это хостовое имя системы, на которой настраивается zabbix-agent. | ||
+ | |||
+ | ===Добавляем пользовательские параметры=== | ||
+ | |||
+ | Просто бросьте это к консоль: | ||
+ | |||
+ | <pre> | ||
+ | cat << 'EOF' > /etc/zabbix/zabbix_agentd.conf.d/userparameter_apcupsd.conf | ||
+ | UserParameter=UPSNAME,/sbin/apcaccess|awk '/^(UPSNAME).*:/ {print $3}' | ||
+ | UserParameter=STATUS,/sbin/apcaccess|awk '/^(STATUS).*:/ {print $3,$4,$5}' | ||
+ | UserParameter=ITEMP,/sbin/apcaccess|awk '/^(ITEMP).*:/ {print $3}' | ||
+ | UserParameter=LOADPCT,/sbin/apcaccess|awk '/^(LOADPCT).*:/ {print $3}' | ||
+ | UserParameter=NUMXFERS,/sbin/apcaccess|awk '/^(NUMXFERS).*:/ {print $3}' | ||
+ | UserParameter=BCHARGE,/sbin/apcaccess|awk '/^(BCHARGE).*:/ {print $3}' | ||
+ | UserParameter=SENSE,/sbin/apcaccess|awk '/^(SENSE).*:/ {print $3}' | ||
+ | UserParameter=LINEV,/sbin/apcaccess|awk '/^(LINEV).*:/ {print $3}' | ||
+ | EOF | ||
+ | </pre> | ||
+ | |||
+ | ===Включить и запустить сервис=== | ||
+ | |||
+ | systemctl enable --now zabbix_agentd | ||
+ | |||
+ | ==А если хочется выключить сервер при длительной работе от аккумулятора и сигналить об этом в Telegram?== | ||
+ | |||
+ | Источник [https://brendonmatheson.com/2020/03/21/automated-remote-host-shutdown-with-apcupsd.html] | ||
+ | |||
+ | ===Добавить соответствующий скрипт=== | ||
+ | |||
+ | Просто бросьте это в консоль | ||
+ | <pre> | ||
+ | cat << 'EOF' > /etc/apcupsd/doshutdown | ||
+ | #!/bin/bash | ||
+ | |||
+ | TELEGRAM_BOT_TOKEN="ваш токен бота" | ||
+ | TELEGRAM_DESTINATION_GROUP_ID="идентификатор чата, в который надо направлять сообщения" | ||
+ | |||
+ | function send_message_telegram(){ | ||
+ | message=${1} | ||
+ | curl -s -X POST \ | ||
+ | -H 'Content-Type: application/json' \ | ||
+ | -d "{\"chat_id\": \"${TELEGRAM_DESTINATION_GROUP_ID}\", \"text\": \"${message}\", \"disable_notification\": true}" \ | ||
+ | https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage > /dev/null | ||
+ | } | ||
+ | |||
+ | WALL=wall | ||
+ | |||
+ | echo "Shutdown initiated by apcupsd" | ${WALL} | ||
+ | |||
+ | send_message_telegram "Сетевое хранилище и сервер получили сигнал на выключение в связи с критическим уровнем заряда на ИБП" | ||
+ | |||
+ | echo "Issuing shutdown command to STORAGE" | ${WALL} | ||
+ | # например, выключаем хранилище, посредством выполнения команды через ssh (storage в данном случае это имя сервера хранилища, | ||
+ | # доступ к которому настроен через ключи ssh) | ||
+ | ssh storage "/sbin/poweroff" & | ||
+ | |||
+ | echo "Issuing shutdown command to SERVER" | ${WALL} | ||
+ | # например, даём команду прямо на сервере, где работает apcupsd | ||
+ | /sbin/shutdown -h now & | ||
+ | |||
+ | |||
+ | EOF | ||
+ | </pre> | ||
+ | |||
+ | ===Сделать скрипт исполняемым=== | ||
+ | |||
+ | chmod +x /etc/apcupsd/doshutdown | ||
+ | |||
+ | ===Настроить параметры реагирования по вкусу=== | ||
+ | |||
+ | В файле | ||
+ | |||
+ | /etc/apcupsd/apcupsd.conf | ||
+ | |||
+ | есть несколько параметров, которые могут влиять на момент выполнение выше описанного скрипта | ||
+ | |||
+ | /etc/apcupsd/doshutdown | ||
+ | |||
+ | <pre> | ||
+ | # этот параметр не совсем влияет на выполнение скрипта, но тоже полезен | ||
+ | # он задаётся в секундах и определяет сколько секунд apcupsd будет игнорировать сигналы о пропадании питания | ||
+ | ONBATTERYDELAY 6 | ||
+ | |||
+ | # параметры BATTERYLEVEL, MINUTES и TIMEOUT (выкручен в 0, т.к. в основном нужен для не очень умных ИБП. Подробнее см. в оригинальном файле) | ||
+ | # работают вместе. Влияют на выполнение скрипта по принципу "какое событие раньше наступит" | ||
+ | |||
+ | # уровень заряда батареи ИБП в процентах (по мнению самого ИБП) | ||
+ | BATTERYLEVEL 50 | ||
+ | |||
+ | # количество времени в минутах, в течение которого ИБП недоступно электропитание, по истечении которого будет запущен скрипт doshutdown | ||
+ | MINUTES 20 | ||
+ | </pre> | ||
+ | |||
+ | Например при такой конфигурации: | ||
+ | |||
+ | <pre> | ||
+ | ONBATTERYDELAY 6 | ||
+ | BATTERYLEVEL 50 | ||
+ | MINUTES 20 | ||
+ | </pre> | ||
+ | |||
+ | скрипт | ||
+ | |||
+ | /etc/apcupsd/doshutdown | ||
+ | |||
+ | будет запущен или по достижении процента заряда аккумулятора ИБП в значение 50%, или через 20 минут после потери ИБП электропитания: в зависимости от того, что наступит раньше. | ||
+ | |||
+ | Сервер apcupsd при этом не будет реагировать на отключение электропитания в том случае, если отключение и подключение питания прошли в пределах 6-ти секунд | ||
+ | |||
+ | ===Важный параметр, некорректная настройка которого приведёт к непредвиденному выключению сервера!=== | ||
+ | |||
+ | Экспериментально было выяснено, что в файле | ||
+ | |||
+ | /etc/apcupsd/apccontrol | ||
+ | |||
+ | в конструкции case есть вариант | ||
+ | |||
+ | <pre> | ||
+ | doshutdown) | ||
+ | echo "UPS ${2} initiated Shutdown Sequence" | ${WALL} | ||
+ | ${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown" | ||
+ | ;; | ||
+ | </pre> | ||
+ | |||
+ | , которая предполагает выполнение команды выключения сервера, на котором работает apcupsd. | ||
+ | |||
+ | Выключение произойдёт после выполнения выше описанного скрипта | ||
+ | |||
+ | /etc/apcupsd/doshutdown | ||
+ | |||
+ | (даже если в нём закомментировать вызов команды выключения сервера) | ||
+ | |||
+ | Таким образом, например, можно внезапно получить остановку сервера при тестировании (когда команда отключения сервера в скрипте не вызывается). | ||
+ | |||
+ | Следовательно, нужно отключить этот параметр. Для этого достаточно привести секцию внутри case к такому виду: | ||
+ | |||
+ | <pre> | ||
+ | doshutdown) | ||
+ | echo "UPS ${2} initiated Shutdown Sequence" | ${WALL} | ||
+ | # DISABLED. SEE /etc/apcupsd/doshutdown for more info... | ||
+ | #${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown" | ||
+ | ;; | ||
+ | </pre> | ||
+ | |||
+ | затем перезапустить сервис apcupsd. | ||
+ | |||
+ | ====Важно!==== | ||
+ | |||
+ | В процессе обновления сервера нужно следить за файлом | ||
+ | /etc/apcupsd/apccontrol | ||
+ | , поскольку он может обновиться к умолчальным настройкам! | ||
+ | |||
+ | ===Перезапуск сервера после перенастройки=== | ||
+ | |||
+ | После перенастройки конфигурационного файла нужно не забыть перезапустить сервер | ||
+ | |||
+ | systemctl restart apcupsd |
Текущая версия на 21:09, 22 декабря 2023
Содержание
Настройка apcupsd на ОС Альт
Я точно знаю, что оно должно работать, но не работает. Почему?
Потому что по умолчанию порт
/dev/ttyS0
занят сервисом
getty@ttyS0
, который задействует этот порт (обычно, единственный на сервере com-порт) для вывода туда программы
login
Чтобы, например, не держать монитор для сервера а зацепляться за консоль по гипертерминалу.
Отличное решение, но чтобы понять почему на нужный для обмена с UPS порт не происходит должным образом подключение посредством сервиса
apcupsd
у пользователя, в зависимости от квалификации и опыта, может уйти от одного дня до ... бесконечности...
Привет, Alt Linux Team :-)
Как всё сделать как надо?
1. Отключаем сервис, чтобы он больше не занимал порт
systemctl stop getty@ttyS0 systemctl disable getty@ttyS0
2. Поставить apcupsd
apt-get update && apt-get install -y apcupsd
3. Настроить и включить сервис на порту /dev/ttyS0
Конфиг файл
/etc/apcupsd/apcupsd.conf
должен содержать следующие параметры раскомментированными
UPSNAME apc UPSCABLE smart UPSTYPE apcsmart DEVICE /dev/ttyS0 LOCKFILE /var/lock/serial SCRIPTDIR /etc/apcupsd PWRFAILDIR /etc/apcupsd NOLOGINDIR /etc ONBATTERYDELAY 6 BATTERYLEVEL 5 MINUTES 3 TIMEOUT 0 ANNOY 300 ANNOYDELAY 60 NOLOGON disable KILLDELAY 0 NETSERVER on NISIP 127.0.0.1 NISPORT 3551 EVENTSFILE /var/lib/apcupsd/apcupsd.events EVENTSFILEMAX 10 UPSCLASS standalone UPSMODE disable STATTIME 0 STATFILE /var/lib/apcupsd/apcupsd.status LOGSTATS off DATATIME 0
Включить и запустить сервис
systemctl enable --now apcupsd
4. Проверка вручную
/sbin/apcaccess
ну и дальше на-grep-пать по вкусу, как это сделано ниже для интеграции с zabbix-агентом...
А если хочется в zabbix?
Скачать шаблон и импортировать в свою версию Zabbix
Качать отсюда
Далее этот импортированный шаблон нужно добавить на тот хост, на zabbix-agent-е которого настроены дополнительные пользовательские переменные (об этом см. ниже).
А сам процесс настройки пользовательских переменных для zabbix-агента заботливо описан в README.md на github по некоторой ссылке, которая отсутствует в свободном доступе...
Настраиваем zabbix-agent
Если ещё не установлен:
apt-get update && apt-get install -y zabbix-agent
После установки файл конфигурации агента
/etc/zabbix/zabbix_agentd.conf
нужно привести к виду:
LogFile=/var/log/zabbix/zabbix_agentd.log Server=%SERVER_ADDR% Hostname=%ZABBIX_AGENT_HOSTNAME% Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf
, где
%SERVER_ADDR%
это ip или домен сервера zabbix, а
%ZABBIX_AGENT_HOSTNAME%
это хостовое имя системы, на которой настраивается zabbix-agent.
Добавляем пользовательские параметры
Просто бросьте это к консоль:
cat << 'EOF' > /etc/zabbix/zabbix_agentd.conf.d/userparameter_apcupsd.conf UserParameter=UPSNAME,/sbin/apcaccess|awk '/^(UPSNAME).*:/ {print $3}' UserParameter=STATUS,/sbin/apcaccess|awk '/^(STATUS).*:/ {print $3,$4,$5}' UserParameter=ITEMP,/sbin/apcaccess|awk '/^(ITEMP).*:/ {print $3}' UserParameter=LOADPCT,/sbin/apcaccess|awk '/^(LOADPCT).*:/ {print $3}' UserParameter=NUMXFERS,/sbin/apcaccess|awk '/^(NUMXFERS).*:/ {print $3}' UserParameter=BCHARGE,/sbin/apcaccess|awk '/^(BCHARGE).*:/ {print $3}' UserParameter=SENSE,/sbin/apcaccess|awk '/^(SENSE).*:/ {print $3}' UserParameter=LINEV,/sbin/apcaccess|awk '/^(LINEV).*:/ {print $3}' EOF
Включить и запустить сервис
systemctl enable --now zabbix_agentd
А если хочется выключить сервер при длительной работе от аккумулятора и сигналить об этом в Telegram?
Источник [1]
Добавить соответствующий скрипт
Просто бросьте это в консоль
cat << 'EOF' > /etc/apcupsd/doshutdown #!/bin/bash TELEGRAM_BOT_TOKEN="ваш токен бота" TELEGRAM_DESTINATION_GROUP_ID="идентификатор чата, в который надо направлять сообщения" function send_message_telegram(){ message=${1} curl -s -X POST \ -H 'Content-Type: application/json' \ -d "{\"chat_id\": \"${TELEGRAM_DESTINATION_GROUP_ID}\", \"text\": \"${message}\", \"disable_notification\": true}" \ https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage > /dev/null } WALL=wall echo "Shutdown initiated by apcupsd" | ${WALL} send_message_telegram "Сетевое хранилище и сервер получили сигнал на выключение в связи с критическим уровнем заряда на ИБП" echo "Issuing shutdown command to STORAGE" | ${WALL} # например, выключаем хранилище, посредством выполнения команды через ssh (storage в данном случае это имя сервера хранилища, # доступ к которому настроен через ключи ssh) ssh storage "/sbin/poweroff" & echo "Issuing shutdown command to SERVER" | ${WALL} # например, даём команду прямо на сервере, где работает apcupsd /sbin/shutdown -h now & EOF
Сделать скрипт исполняемым
chmod +x /etc/apcupsd/doshutdown
Настроить параметры реагирования по вкусу
В файле
/etc/apcupsd/apcupsd.conf
есть несколько параметров, которые могут влиять на момент выполнение выше описанного скрипта
/etc/apcupsd/doshutdown
# этот параметр не совсем влияет на выполнение скрипта, но тоже полезен # он задаётся в секундах и определяет сколько секунд apcupsd будет игнорировать сигналы о пропадании питания ONBATTERYDELAY 6 # параметры BATTERYLEVEL, MINUTES и TIMEOUT (выкручен в 0, т.к. в основном нужен для не очень умных ИБП. Подробнее см. в оригинальном файле) # работают вместе. Влияют на выполнение скрипта по принципу "какое событие раньше наступит" # уровень заряда батареи ИБП в процентах (по мнению самого ИБП) BATTERYLEVEL 50 # количество времени в минутах, в течение которого ИБП недоступно электропитание, по истечении которого будет запущен скрипт doshutdown MINUTES 20
Например при такой конфигурации:
ONBATTERYDELAY 6 BATTERYLEVEL 50 MINUTES 20
скрипт
/etc/apcupsd/doshutdown
будет запущен или по достижении процента заряда аккумулятора ИБП в значение 50%, или через 20 минут после потери ИБП электропитания: в зависимости от того, что наступит раньше.
Сервер apcupsd при этом не будет реагировать на отключение электропитания в том случае, если отключение и подключение питания прошли в пределах 6-ти секунд
Важный параметр, некорректная настройка которого приведёт к непредвиденному выключению сервера!
Экспериментально было выяснено, что в файле
/etc/apcupsd/apccontrol
в конструкции case есть вариант
doshutdown) echo "UPS ${2} initiated Shutdown Sequence" | ${WALL} ${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown" ;;
, которая предполагает выполнение команды выключения сервера, на котором работает apcupsd.
Выключение произойдёт после выполнения выше описанного скрипта
/etc/apcupsd/doshutdown
(даже если в нём закомментировать вызов команды выключения сервера)
Таким образом, например, можно внезапно получить остановку сервера при тестировании (когда команда отключения сервера в скрипте не вызывается).
Следовательно, нужно отключить этот параметр. Для этого достаточно привести секцию внутри case к такому виду:
doshutdown) echo "UPS ${2} initiated Shutdown Sequence" | ${WALL} # DISABLED. SEE /etc/apcupsd/doshutdown for more info... #${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown" ;;
затем перезапустить сервис apcupsd.
Важно!
В процессе обновления сервера нужно следить за файлом /etc/apcupsd/apccontrol , поскольку он может обновиться к умолчальным настройкам!
Перезапуск сервера после перенастройки
После перенастройки конфигурационного файла нужно не забыть перезапустить сервер
systemctl restart apcupsd