Apcupsd: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Добавляем пользовательские параметры)
(Важный параметр, некорректная настройка которого приведёт к непредвиденному выключению сервера!)
 
(не показано 17 промежуточных версий этого же участника)
Строка 23: Строка 23:
 
у пользователя, в зависимости от квалификации и опыта, может уйти от одного дня до ... бесконечности...
 
у пользователя, в зависимости от квалификации и опыта, может уйти от одного дня до ... бесконечности...
  
 +
 +
'''Привет, Alt Linux Team  :-)'''
  
 
==Как всё сделать как надо?==
 
==Как всё сделать как надо?==
Строка 37: Строка 39:
 
===3. Настроить и включить сервис на порту /dev/ttyS0===
 
===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?==
Строка 44: Строка 91:
 
  Качать [https://github.com/zabbix/community-templates/tree/main/Power_(UPS)/APC/template_apcupsd отсюда]
 
  Качать [https://github.com/zabbix/community-templates/tree/main/Power_(UPS)/APC/template_apcupsd отсюда]
  
Однако, сразу данные в этот шаблон приходить не будут, т.к. шаблон определяет только переменные для получения их от zabbix-агента.
+
Далее этот импортированный шаблон нужно добавить на тот хост, на zabbix-agent-е которого настроены дополнительные пользовательские переменные (об этом см. ниже).
  
А сам процесс настройки пользовательских переменных для zabbix-агента заботливо описан по некоторой ссылке, которая отсутствует в свободном доступе...
+
А сам процесс настройки пользовательских переменных для zabbix-агента заботливо описан в README.md на github по некоторой ссылке, которая отсутствует в свободном доступе...
  
 
===Настраиваем zabbix-agent===
 
===Настраиваем zabbix-agent===
Строка 54: Строка 101:
 
  apt-get update && apt-get install -y zabbix-agent
 
  apt-get update && apt-get install -y zabbix-agent
  
После установки в корректно настроенном агенте файл
+
После установки файл конфигурации агента
  
 
  /etc/zabbix/zabbix_agentd.conf
 
  /etc/zabbix/zabbix_agentd.conf
  
должен содержать такие раскоментированные параметры:
+
нужно привести к виду:
  
 
  LogFile=/var/log/zabbix/zabbix_agentd.log
 
  LogFile=/var/log/zabbix/zabbix_agentd.log
Строка 95: Строка 142:
  
 
  systemctl enable --now zabbix_agentd
 
  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