PVE+NUT+群晖等配置
Posted 一WILLPOWER一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PVE+NUT+群晖等配置相关的知识,希望对你有一定的参考价值。
文章目录
只需要实现,断电后,PVE关闭所有的虚拟机,低电量关闭PVE,如果PVE还没有关闭,来电了,则打开所有虚拟机
配置
-
安装必要工具
sudoapt install nut nut-client nut-server
-
扫描查看ups信息
ups-scanner -U
-
将配置放在
ups.conf
中,注意名字改为ups(为了群晖能够连接上)
-
启动驱动程序
upsdrvctl start
- 设置监听,修改
upsd.conf
文件,最后一行添加LISTEN 0.0.0.0 3493
- 修改
nut.conf
模式,让upsd服务决定哪些文件有用,因为我们让pve作为服务器,因此为netserver
模式
- 启动
upsd
服务
输入upsd
- 测试一下连接,使用
upsc ups@localhost ups.status
- 这个时候,通过群晖访问应该是没有问题的。
- 设置相关事件的处理,总的来说首先是upsmon->upssched->upssched-cmd
注意设置upssched的路径,NOTIFYMSG这些有默认的内容,我们可以重写,自定义修改,然后就是注意后面要upssched-cmd执行的话,一定要填写EXEC在事件后面!
#这个很重要
RUN_AS_USER root
MONITOR ups@localhost 1 monuser secret master
#这里可以自定义内容
NOTIFYMSG ONLINE "UPS %s on line power"
NOTIFYMSG ONBATT "UPS %s on battery "
NOTIFYMSG LOWBATT "UPS %s battery is low"
#这个也很重要,首先upsmon->upssched->upssched-cmd
#注意路径
#[参考文章](https://networkupstools.org/docs/user-manual.chunked/ar01s07.html)
#upssched 是 upsmon 的助手,它将在与 UPS 事件相关的某个时间间隔为您调用命令。它可用于发送页面、邮寄有关事物的通知,甚至提前关闭盒>子。
NOTIFYCMD /usr/sbin/upssched
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
- 然后编写配置文件
upssched.conf
CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /etc/nut/upssched.pipe
LOCKFN /etc/nut/upssched.lock
# 断电使用电池开始计时30秒,计时后,执行upssched-cmd脚本,带shutdown_all参数
AT ONBATT * START-TIMER shutdown_all 30
# 来电后,停止shutdown_all计时
AT ONLINE * CANCEL-TIMER shutdown_all
# 来电后,执行脚本,带start_all参数
AT ONLINE * EXECUTE start_all
# 低电量,执行脚本,带shutdown_self参数
AT LOWBATT * EXECUTE shutdown_self
- 然后编写脚本(要有执行权限)
upssched-cmd
, 这里就是具体执行的地方
#! /bin/sh
case $1 in
shutdown_self)
#关闭所有
upsmon -c fsd
;;
shutdown_all)
pvesh create /nodes/pve/qemu/100/status/stop
pvesh create /nodes/pve/qemu/101/status/stop
pvesh create /nodes/pve/qemu/102/status/stop
;;
start_all)
#开启所有
pvesh create /nodes/pve/qemu/100/status/start
pvesh create /nodes/pve/qemu/101/status/start
pvesh create /nodes/pve/qemu/102/status/start
;;
*)
logger -t upssched-cmd "Unrecognized command: $1"
;;
esac
- 重启所有服务
systemctl restart nut-client.service nut-server.service nut-monitor.service; \\
upsdrvctl stop; \\
sleep 1; \\
upsdrvctl start;
注意,什么时候是低电量,可以配置只需要修改ups.conf
即可
注意ignorable
文件说明
ups.conf
:这个文件是用于ups的驱动配置(每个ups都需要设置),这里可以覆盖默认的一些配置
nut.conf
:该文件是nut决定服务类型的文件,很重要,你是作为服务器?还是客户端还是独立端之类的
upsd.conf
:该文件设置监听或者访问之类的
upsd.users
:该文件设置 upsd(UPS 网络守护程序)的权限。用户在这里定义,被赋予密码,他们的权限也在这里被控制。 由于此文件将包含密码,因此请确保它的安全,只有足够的权限让 upsd 读取它。
upsmon.conf
:ups monitor程序,就是监控程序,这里设置监控ups事件、通知等,是最重要的文件,它决定了如何处理。
upssched.conf
:在upsmon中设置通知执行的程序upssched后,它就会得到使用,主要是方便用户在这里设置定时器以及脚本输入参数,来处理事件
upssched-cmd
:该文件在upssched.conf中设置,定时结束或者直接执行的话,就会调用该脚本,其中第一个参数就是设定的事件,一般用case语句来处理(这里就是最终执行的脚本)
默认配置(翻译的)
ups.conf(设置ups通信相关)
# Network UPS Tools: example ups.conf
#
# --- 安全说明 ---
#
# 如果您使用 snmp-ups 并在此处设置社区字符串
# 则必须保护此文件以防止其他用户获取该字符串
# 它需要 upsdrvctl 和任何驱动程序以及 upsd 可读。
#
# 这是您配置该系统将直接监控的所有 UPS 的地方。
# 这些通常连接到串行端口,但也支持 USB 设备和 SNMP 设备
#
#
# upsdrvctl 使用此文件来启动和停止您的驱动程序,
# upsd 也使用此文件来确定要监视的驱动程序。
# 驱动程序本身也会读取此文件以获取配置指令。#
#
#
# The general form is:
#
# [upsname]
# driver = <drivername>
# port = <portname>
# < any other directives here >
#
# 节标题 ([upsname]) 可以是任何内容,
# 只要它是括号内的单个单词即可。
# upsd 使用它来唯一标识此系统上的 UPS。#
#
#
#
# 如果您有一个名为 snoopy 的 UPS,
# 您的部分标题将是“[snoopy]”。
# 在名为“doghouse”的系统上,upsmon.conf 中用于监视它的行看起来像这样:
#
#
# MONITOR snoopy@doghouse 1 upsmonuser mypassword master
#
# 如果在slave模式下监控可能是这样的:
#
# MONITOR snoopy@doghouse 1 upsmonuser mypassword slave
#
# 配置指令
# ------------------------
#
# 这些指令仅由 upsdrvctl 使用,应在驱动程序定义之外指定:#
#
# maxretry:
# 可选的。 指定在失败的情况下在放弃之前尝试启动驱动程序的次数。
# 在每次尝试之间插入“retrydelay”延迟。 使用此选项时应小心,因为它会影响系统启动所需的时间。
# 默认值为 1 次尝试。
#
# retrydelay:
# 可选的。 指定驱动程序每次重新启动尝试之间的延迟,
# 由“maxretry”指定。 使用此选项时应小心,因为它会影响系统启动所需的时间。
# 默认值为 5 秒。
#
# 这些指令对于支持 ups.conf 的所有驱动程序都是通用的:
#
# driver:
# 必需的。 指定要运行的程序以与此 UPS 通信。 apcsmart、bestups 和 sec 就是一些例子。
#
# port:
# 必需的。 连接 UPS 的串行端口。 例如,/dev/ttyS0 通常是 Linux 机器上的第一个端口。
#
# sdorder:
# 选修的。 当您的系统上有多个 UPS 时,您通常需要按特定顺序关闭它们。
# upsdrvctl 关闭所有 0,然后是 1、2 等等。 要从关闭序列中排除 UPS,请将其设置为 -1。 #
# 此参数的默认值为 0。
#
# nolock:
# 可选的, 并且不推荐在此文件中使用。如果在这里设置nolock,则驱动程序每次启动时都不会锁定串口。
# 如果您错误地启动多个进程,这可能会允许其他进程占用端口。
# 这仅适用于必须绝对禁用锁定才能使软件工作的系统。
#
# maxstartdelay:
# 可选的。这可以设置为第一个 UPS 定义之上的全局变量,也可以在 UPS 部分中设置。
# 该值控制#upsdrvctl 等待驱动程序完成启动的时间。 这可以防止您的系统因驱动器或 UPS 损坏而卡住。
# 默认值为 45 秒。
#
# synchronous:
# 可选的。 驱动程序默认在异步模式下工作(即 *synchronous=no*)。
# 这意味着所有数据都由驱动程序在通信套接字上推送到 upsd(Unix 上的 Unix 套接字,
# Windows 上的命名管道),而无需等待这些数据被实际消费。
# 对于一些可以产生大量数据的硬件,例如 ePDU,异步模式可能会导致一些拥塞,导致套接字已满,驱动程序显示为未连接。
# 通过启用“同步”标志(值 =“是”),驱动程序将等待数据被 upsd 使用,然后再发布更多数据。
# 这可以全局或每个驱动程序启用。
# 默认为“否”(即异步模式)以实现驱动程序行为的向后兼容性。
#
# 任何其他内容都传递给驱动程序的硬件特定部分。
#
# Examples
# --------
#
# 一个名为“powerpal”的 UPS 在 /dev/ttyS0 上使用 blazer_ser 驱动程序的简单示例是:
#
# [powerpal]
# driver = blazer_ser
# port = /dev/ttyS0
# desc = "Web server"
#
# 如果您的 UPS 驱动需要额外设置,您可以在此处指定。 例如,如果它支持变量“cable”的设置为“1234”,它将如下所示:
# [myups]
# driver = mydriver
# port = /dev/ttyS1
# cable = 1234
# desc = "Something descriptive"
#
# 要查明您的驱动程序是否支持任何额外设置,请使用 -h 选项启动它和/或阅读驱动程序的文档。
# Set maxretry to 3 by default, this should mitigate race with slow devices:
maxretry = 3
upsd.conf(设置ups客户访问的相关信息)
# Network UPS Tools: example upsd configuration file
#
# 此文件包含访问控制数据,您应妥善保管。
#
# 只有 upsd 成为的用户才能读取它。 请参阅常见问题解答。
#
# 下面的每个条目都提供了用法和默认值。
# =======================================================================
# MAXAGE <seconds>
# MAXAGE 15
#
# 默认为 15 秒。 在 UPS 驱动停止更新数据这么多秒后,upsd 将其标记为陈旧并停止向客户提供该信息。
# 毕竟,唯一比没有数据更糟糕的是坏数据。
# 如果您的驱动程序难以在正常的 15 秒间隔内保持数据新鲜,您应该只使用它。
# 观察系统日志,了解来自 upsd 的关于过时的通知。
# =======================================================================
# STATEPATH <path>
# STATEPATH /var/run/nut
#
# 告诉 upsd 在“路径”中查找驱动程序状态套接字,而不是编译到程序中的默认值。
# =======================================================================
# LISTEN <address> [<port>]
# LISTEN 127.0.0.1 3493
# LISTEN ::1 3493
#
# 这默认为本地主机侦听地址和端口 3493。
# 在禁用 IP v4 或 v6 内核的情况下,将仅使用可用的内核。
#
# 您可以指定希望 upsd 侦听连接的每个接口,
# 可选地带有端口号。
#
# 如果您的机器上有多个接口并且您不希望 upsd 监听所有接口
# (例如在防火墙上,您可能不想监听外部接口),您可能需要这个。
#
# 这只会在 upsd 启动时读取。 如果在此处进行更改,则需要重新启动 upsd,重新加载将无效。
# =======================================================================
# MAXCONN <connections>
# MAXCONN 1024
#
# 这默认为系统允许的最大数量。 每个 UPS、每个 LISTEN 地址和每个客户端都算作一个连接。
# 如果服务器用完连接,它将不再接受新的传入客户端连接。 仅当您确切知道自己在做什么时才设置此项。
# =======================================================================
# CERTFILE <certificate file>
# CERTFILE /usr/local/ups/etc/upsd.pem
#
# 当使用 OpenSSL 后端的 SSL 支持进行编译时,您可以在此处输入证书文件。
# 证书必须采用 PEM 格式,并且必须从主题的证书(服务器证书)开始排序,然后是中间 CA 证书
#(如果适用_和最高级别(根)CA。它应该以服务器密钥结尾。
# 请参阅“文档/ security.txt' 或 NUT 用户手册的安全章节,了解有关 NUT 中 SSL 支持的更多信息。
#
# 有关 NUT 中 SSL 支持的更多信息,请参阅“docs/security.txt”或 NUT 用户手册的安全章节。
# =======================================================================
# CERTPATH <certificate file or directory>
# CERTPATH /usr/local/ups/etc/cert/upsd
#
# 当使用 NSS 后端的 SSL 支持编译时,您可以在此处输入证书路径。
# 证书存储在专用数据库中(分为 3 个文件)。
# 指定数据库目录的路径。
#
# 有关 NUT 中 SSL 支持的更多信息,请参阅“docs/security.txt”或 NUT 用户手册的安全章节。
# =======================================================================
# CERTIDENT <certificate name> <database password>
# CERTIDENT "my nut server" "MyPasSw0rD"
#
# 当使用 NSS 后端的 SSL 支持进行编译时,您可以指定要从数据库中检索的证书名称以验证自身以及访问证书相关私钥所需的密码。
#
# 有关 NUT 中 SSL 支持的更多信息,请参阅“docs/security.txt”或 NUT 用户手册的安全章节。
# =======================================================================
# CERTREQUEST <certificate request level>
# CERTREQUEST REQUIRE
#
# 当使用带有 NSS 后端和客户端证书验证的 SSL 支持编译时(默认情况下禁用,请参阅“docs/security.txt”),您可以指定 upsd 是否请求或需要客户端的证书。
# 可能的值是:
# - 0 不要求客户端提供任何证书
# - 1 要求所有客户提供证书
# - 2 要求所有客户提供有效证书
#
# 有关 NUT 中 SSL 支持的更多信息,请参阅“docs/security.txt”或 NUT 用户手册的安全章节。
upsd.users(设置upsd用户)
# Network UPS Tools: Example upsd.users
#
# 此文件设置 upsd(UPS 网络守护程序)的权限。
# 用户在这里定义,被赋予密码,他们的权限也在这里被控制。
# 由于此文件将包含密码,因此请确保它的安全,只有足够的权限让 upsd 读取它。
# --------------------------------------------------------------------------
# 每个用户都有一个部分。 要开始一个部分,请将用户名单独放在一行的括号中。
# 要为该用户设置某些内容,请在该部分标题下指定它。 用户名区分大小写,因此 admin 和 AdMiN 是两个不同的用户。
#
# 可以设置的参数:
#
# password: 用户的密码。 这是区分大小写的。
#
# --------------------------------------------------------------------------
#
# actions: 让用户用 upsd 做某些事情。
#
# 有效的 actions 参数为:
#
# SET - 更改 UPS 中某些变量的值
# FSD - 在 UPS 中设置“强制关机”标志
#
# --------------------------------------------------------------------------
#
# instcmds:让用户启动特定的即时命令。 使用“ALL”自动授予所有命令。
# 有许多可能的命令,因此请使用“upscmd -l”查看您的硬件支持的命令。 这里有一些例子:
#
# test.panel.start - 开始前面板测试
# test.battery.start - 开始电池测试
# test.battery.stop - 停止电池测试
# calibrate.start - 开始校准
# calibrate.stop - 停止校准
#
# --------------------------------------------------------------------------
#
# Example:
#
# [admin]
# password = mypass
# actions = SET
# instcmds = ALL
#
# --- 为只能执行测试的用户配置
#
# [testuser]
# password = pass
# instcmds = test.battery.start
# instcmds = test.battery.stop
#
# --- 配置 upsmon
#
# 要为您的 upsmon 添加用户,请使用以下示例:
#
# [upsmon]
# password = pass
# upsmon master
# or
# upsmon slave
#
# upsmon.conf 中匹配的 MONITOR 行如下所示:
#
# MONITOR myups@localhost 1 upsmon pass master (or slave)
nut.conf(nut的配置,主要是模式,决定使用哪些文件)
# Network UPS Tools: example nut.conf
#
##############################################################################
# 一般部分
##############################################################################
# MODE决定了要启动NUT的哪一部分,以及必须修改哪些配置文件。
#
# 这个文件试图标准化在该领域发现的各种文件,比如基于 Debian 的系统上的 /etc/default/nut,
# 基于 RedHat 的系统上的 /etc/sysconfig/ups,...发行版的初始化脚本应该获取这个文件以查看哪个 必须启动组件。
#
# MODE 的值可以是:
# - none:
# NUT 未配置,或使用集成电源管理,或使用某些外部系统启动 NUT 组件。 所以没有什么可以开始的。
# - standalone:
# 此模式仅适用于本地配置,使用 1 个 UPS 保护本地系统。
# 这意味着启动 3 个 NUT 层(驱动程序、upsd 和 upsmon)和匹配的配置文件。
# 这种模式还可以解决 UPS 冗余问题。
# - netserver:
# 与独立配置相同,但还需要更多网络访问控制(防火墙、tcp-wrappers),
# 可能还需要 upsd.conf 中的特定 LISTEN 指令。由于此模式对网络开放,因此应特别注意安全性 担忧。
# - netclient:
# 这种模式只需要 upsmon。
#
# 重要的提示:
# 该文件旨在由 shell 脚本获取。 您不得在等号周围使用空格!
MODE=none
upsmon.conf
# Network UPS Tools: example upsmon configuration
#
# 此文件包含密码,因此请妥善保管。
# --------------------------------------------------------------------------
# RUN_AS_USER <userid>
#
# 默认情况下,upsmon 分为两个进程。
# 一个保持 root 身份并等待运行 SHUTDOWNCMD。
# 另一个切换到另一个用户标识并执行其他所有操作。
#
# 默认的非特权用户在编译时设置为
# 'configure --with-user=...'.
#
# 您可以在启动 upsmon 时用“-u <user>”覆盖它,或者为了方便在这里定义它。
#
# 注意:如果您打算使用重新加载功能,则此文件 (upsmon.conf) 必须可供该用户读取!
# 因为它包含密码,所以不要让它成为世界可读的。
# 此外,不要让它对 upsmon 用户可写,因为它会通过将 SHUTDOWNCMD 更改为恶意内容来创造攻击机会。
#
# 为了获得最佳结果,您应该创建一个新的普通用户,例如“nutmon”,并使其成为“nut”组或类似组的成员。
# 然后在此处指定它并授予对该组的 upsmon.conf 的读取权限。
#
# 此用户不应具有对 upsmon.conf 的写入权限。
#
# RUN_AS_USER nut
# --------------------------------------------------------------------------
# MONITOR <system> <powervalue> <username> <password> ("master"|"slave")
#
# 列出您要监控的系统。 并非所有这些都可能为运行 upsmon 的系统供电,但如果你想观看它,它必须在本节中。
#
# 您必须至少声明其中一项。
#
# <system> 是 <upsname>@<hostname>[:<port>] 形式的 UPS 标识符,如 ups@localhost、su700@mybox 等。
#
# Examples:
#
# - "su700@mybox" 表示名为“mybox”的系统上名为“su700”的 UPS
#
# - "fenton@bigbox:5678" 是一个名为“bigbox”的系统上名为“fenton”的 UPS,它在端口“5678”上运行 upsd。
#
# UPS 名称(如“su700”和“fenton”)在 ups.conf 中的 [brackets] 中设置,用于标识特定驱动程序的部分。
#
# 如果主机“doghouse”上的 ups.conf 有一个名为“snoopy”的部分,则它的标识符将为“snoopy@doghouse”。
#
# <powervalue> 是一个整数 - 此 UPS 为该系统供电的电源数量。
# 大多数计算机只有一个电源,因此通常设置为 1。您需要一个非常大或特殊的盒子才能在此处设置任何其他值。
#
# 对于不提供任何电源但仍要监视的系统,您也可以将其设置为 0。 当您想了解给定 UPS 的变化而不在它变得关键时关闭时使用此选项,除非 <powervalue> 为 0。
#
# <username> 和 <password> 必须与该系统的 upsd.users 中的条目相匹配。 如果您的用户名是“monmaster”,密码是“blah”,upsd.users 将如下所示:
#
# [monmaster]
# password = blah
# upsmon master (or slave)
#
# “master”表示该系统将最后关闭,让从属系统有时间首先关闭。
#
# "slave" 意味着当电源变得关键时,该系统会立即关闭。
#
# Examples:
#
# MONITOR myups@bigserver 1 monmaster blah master
# MONITOR su700@server.example.com 1 upsmon secretpass slave
# MONITOR myups@localhost 1 upsmon pass master (or slave)
# --------------------------------------------------------------------------
# MINSUPPLIES <num>
#
# 给出为保持该系统运行而必须通电的电源数量。 大多数系统都有一个电源,因此您可以在此字段中输入“1”。
#
# 大型/昂贵的服务器类型系统通常有更多,并且可以在缺少一些的情况下运行。 例如,HP NetServer LH4 可以运行 4 个中的 2 个,因此您可以将其设置为 2。这个想法是让机器尽可能长时间地运行,对吧?
#
# 显然,您必须将冗余电源放在不同的 UPS 电路上,这样才有意义! 有关如何使用此功能的更多信息和想法,请参阅 docs 子目录中的 big-servers.txt。
MINSUPPLIES 1
# --------------------------------------------------------------------------
# SHUTDOWNCMD "<command>"
#
# upsmon 在系统需要关闭时运行此命令。
#
# 这应该适用于几乎所有地方......如果它没有,那么改变它。
SHUTDOWNCMD "/sbin/shutdown -h +0"
# --------------------------------------------------------------------------
# NOTIFYCMD <command>
#
# upsmon 在事情发生时调用它来发送消息
#
# 调用此命令时将消息的全文作为一个参数。
# 环境字符串 NOTIFYTYPE 将包含导致此事件发生的任何类型字符串。
#
# 请注意,这仅针对通过 NOTIFYFLAG 设置了 EXEC 的 NOTIFY 事件调用。 有关更多详细信息,请参见下面的 NOTIFYFLAG。
#
# 制作某种 shell 脚本可能不是一个坏主意。 有关更多信息和想法,请参阅 docs/scheduling.txt
#
# Example:
# NOTIFYCMD /bin/notifyme
# ----------------------------------PVE+NUT+群晖等配置