一次意外的斷電就足以造成嚴重的系統損害,因此建立完善的 UPS 監控機制變得格外重要。今天玄貓要分享如何運用樹莓派搭配 Network UPS Tools (NUT) 開發一套專業的 UPS 監控系統。

為何需要 UPS 監控系統?

在實際營運環境中,斷電往往來得措手不及。若沒有適當的監控機制,系統可能在電力耗盡前無法正常關機,導致資料損失或硬體受損。透過 NUT 監控系統,我們可以:

  • 即時掌握 UPS 電池狀態
  • 在電力不足時自動觸發伺服器安全關機
  • 集中管理多台 UPS 裝置
  • 建立完整的電力事件記錄

NUT 系統架構說明

NUT 採用主從式架構,包含以下核心元件:

  • NUT 伺服器:負責與 UPS 裝置直接溝通
  • NUT 客戶端:連線至 NUT 伺服器取得 UPS 狀態
  • 監控介面:提供 UPS 狀態查詢與管理功能

樹莓派 NUT 伺服器建置步驟

環境準備

首先需要準備以下裝置:

  • 樹莓派(建議使用 Pi 4 或更新版本)
  • microSD 卡(建議 16GB 以上)
  • USB 連線線(連線 UPS)
  • 乙太網路線

系統安裝與基礎設定

  1. 安裝 NUT 套件:
sudo apt install -y nut
  1. 掃描並識別 UPS 裝置:
sudo nut-scanner -U
  1. 設定 UPS 設定檔:
sudo nano /etc/nut/ups.conf

[server-room-ups]
driver = nutdrv_qx
product = UPS
desc = "機房主要 UPS 裝置"
port = auto
vendorid = 0665
productid = 5161
bus = 001

內容解密

讓玄貓為各位解說上述設定的重要引數:

  • [server-room-ups]:代表 UPS 的識別名稱,我們可以自訂一個好記的名字
  • driver:指定使用的驅動程式,這裡使用通用的 nutdrv_qx
  • product:UPS 產品描述
  • desc:裝置說明,方便管理者識別
  • port:設定為 auto 可自動偵測連線埠
  • vendoridproductid:UPS 的硬體識別碼
  • bus:USB 匯流排編號

這些參陣列合確保系統能正確識別並通訊與特定的 UPS 裝置。在實務上,我建議為每台 UPS 設定獨特的識別名稱,並在描述欄位詳細記錄裝置位置與用途,這樣在擴充系統時會更容易管理。

NUT 伺服器進階設定

在設定完基本的 NUT 伺服器後,我們需要進行一些進階設定,以確保系統能安全與有效地運作。以下是關鍵的設定步驟:

設定 UPS 監控使用者

首先,我們需要編輯 upsd.users 檔案來定義可以存取 UPS 的使用者:

[admin]
password = your_admin_password
actions = set
actions = fsd
instcmds = all
upsmon primary

[monitor]
password = your_monitor_password
upsmon secondary

這個設定檔中:

  • admin 使用者擁有完整的管理許可權,可以執行所有指令
  • monitor 使用者只具有基本的監控許可權,適合給一般使用者使用
  • 密碼應使用強度足夠的組合,避免使用簡單密碼

設定網路監聽設定

編輯 upsd.conf 檔案來設定網路監聽:

LISTEN 0.0.0.0 3493

這個設定允許 NUT 伺服器接受來自任何 IP 位址的連線。在正式環境中,建議限制特定 IP 範圍:

# 只允許內部網路連線
LISTEN 192.168.1.0/24 3493

設定 UPS 監控引數

編輯 upsmon.conf 檔案來調整監控引數:

# 主要 UPS 監控設定
MONITOR ups@localhost 1 admin your_admin_password primary

# 設定關機延遲時間(秒)
FINALDELAY 180

# 設定電池電量警告閾值
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"

這些引數的說明:

  • FINALDELAY:系統關機前的等待時間
  • MINSUPPLIES:最少需要幾個 UPS 供電
  • SHUTDOWNCMD:當需要關機時執行的指令

啟用服務自動啟動

設定完成後,需要確保相關服務會在系統啟動時自動執行:

sudo systemctl enable nut-server
sudo systemctl enable nut-monitor
sudo systemctl start nut-server
sudo systemctl start nut-monitor

驗證設定

完成所有設定後,可以使用以下指令檢查 UPS 狀態:

# 檢查 UPS 狀態
upsc ups@localhost

# 檢查服務狀態
systemctl status nut-server
systemctl status nut-monitor

若要測試通知功能,可以手動斷開 UPS 電源,觀察系統是否正確傳送警告。但在測試前,請確保所有重要服務都已做好備份。

安全性考量

  1. 網路安全

    • 設定防火牆只允許必要的 IP 存取
    • 使用強密碼
    • 定期更新系統和 NUT 套件
  2. 監控告警

    • 設定電池電量低於特定值時傳送警告
    • 設定多重通知管道(如電子郵件、簡訊)
    • 定期測試告警系統
  3. 備份設定

    • 定期備份所有 NUT 設定檔
    • 記錄所有設定變更
    • 建立設定回復程式

這些進階設定能確保 UPS 監控系統在緊急情況下正常運作,有效保護您的裝置安全。定期檢查和維護這些設定,將有助於預防潛在問題的發生。

在建置智慧家庭或伺服器環境時,UPS(不斷電系統)的監控管理至關重要。玄貓在多年的系統建置經驗中,發現將 UPS 整合到 Home Assistant 不僅能提供即時監控,更能實作智慧化的電源管理。讓我們探討如何實作這套解決方案。

Home Assistant 與 NUT 整合設定

在 Home Assistant 中整合 NUT(Network UPS Tools)相當直觀。首先需要在 Home Assistant 的整合頁面中加入 NUT 整合元件。系統會自動識別網路中的 NUT Pi 裝置,只需設定 observer 使用者名稱和密碼即可完成基本設定。

建立監控面板

以下是一個精簡但實用的 UPS 監控面板設定範例:

type: vertical-stack
title: 機房 UPS 監控
cards:
  - type: history-graph
    entities:
      - name: 系統狀態
        entity: sensor.server_room_rack_status
    hours_to_show: 4
  - type: gauge
    entity: sensor.server_room_rack_battery_charge
    name: 電池電量
    severity:
      green: 50
      yellow: 20
      red: 0

這個面板包含兩個主要元件:

  1. 歷史顯示最近 4 小時的 UPS 狀態變化
  2. 電量計:以視覺化方式呈現目前電池電量,並透過顏色區分不同電量等級

使用 Docker 佈署 NUT Web 介面

除了 Home Assistant 整合外,我們還可以使用 Docker 佈署一個獨立的 Web 監控介面。以下是佈署指令:

docker run \
-e UPSD_ADDR=10.0.2.10 \
-e UPSD_USER=observer \
-e UPSD_PASS=您的密碼 \
-p 9000:9000 \
ghcr.io/superioone/nut_webgui:latest

NUT 使用者端節點設定

為確保系統在斷電時能夠安全關機,需要在其他伺服器上設定 NUT 使用者端。以下是設定步驟:

安裝與設定流程

  1. 安裝 NUT 使用者端套件:
sudo apt install nut-client
  1. 測試與伺服器的連線:
upsc server-room-rack@伺服器IP
  1. 設定 UPS 監控設定: 編輯 /etc/nut/upsmon.conf,加入:
MONITOR server-room-rack@伺服器IP 1 observer 密碼 secondary
  1. 修改運作模式: 編輯 /etc/nut/nut.conf,設定:
MODE=netclient
  1. 啟用服務:
sudo systemctl restart nut-client
sudo systemctl enable nut-client

系統監控與日誌

要監控 NUT 系統的運作狀況,可以使用以下指令檢視日誌:

在伺服器端:

journalctl -f -u nut-server

在使用者端:

journalctl -f -u nut-monitor

這套完整的 UPS 監控方案不僅提供了即時的狀態監控,更確保了在斷電情況下系統能夠安全關機。透過 Home Assistant 的整合,我們可以在統一的介面中監控和管理 UPS,大幅提升了系統的可靠性與管理效率。在實際佈署過程中,建議定期測試斷電情境,確保所有節點都能正確回應電源事件。

在多年管理大型資料中心的經驗中,穩定的電源管理系統對維持服務的持續運作至關重要。今天玄貓要分享如何進行 NUT(Network UPS Tools)的進階設定與測試,確保您的 UPS 監控系統運作正常。

UPS 指令操作與監控

基礎指令操作

在 NUT 系統中,我們可以使用以下指令檢視和控制 UPS:

# 列出 UPS 支援的指令
upscmd -l server-room-rack

# 執行快速電池測試(需要管理員密碼)
upscmd -u admin server-room-rack test.battery.start.quick

Debian 12 監控問題與解決方案

在最近的專案中,玄貓發現 Debian 12 的 nut-client 套件存在一個值得注意的問題:當執行 UPS 自我測試時,系統會設定 ‘CAL’(校準)標誌,此時系統會忽略所有重要的 UPS 電池警示。

這個問題的臨時解決方案是:

  1. 定期重啟 nut-client 服務
  2. 使用 cron 排程執行:sudo systemctl restart nut-client

NUT 系統測試策略

經過多次佈署經驗,玄貓建議採用三層式測試策略,確保 NUT 系統的可靠性。

第一層:除錯測試模式

這是最安全的測試方式,不會影響實際系統運作:

# 啟用測試模式
# 修改 /etc/nut/upsmon.conf
DEBUG_MIN = 1

第二層:模擬斷電測試

這種測試可以驗證系統的反應機制:

# 觸發 FSD(強制系統關機)事件
upsmon -c fsd

此指令會模擬 UPS 處於「電池供電與電量低」的狀態,觸發所有連線系統的關機程式。

第三層:實際斷電測試

這是最完整的測試方式,建議在系統維護時段進行:

  1. 拔除 UPS 電源
  2. 使用以下指令監控 UPS 狀態:
# 監控 UPS 狀態
upsc server-room-rack

# 重要引數說明
battery.charge    # 電池電量百分比
battery.voltage   # 電池電壓
ups.load         # UPS 負載
ups.status       # UPS 狀態(OL=正常供電,OB=電池供電)

進階設定建議

根據玄貓的實務經驗,對於高負載伺服器,建議調整以下設定:

  1. 提前關機時間:不要等到電池完全耗盡才關機
  2. 負載監控:根據實際負載調整關機觸發條件
  3. 自動化佈署:使用 Ansible 等工具統一管理設定

最後,系統將在電池電量降至設定閾值或剩餘時間不足時,自動觸發關機程式。這種預防性的設定可以有效避免資料損失,確保系統安全關機。

在多年的維運經驗中,玄貓發現適當的設定和定期測試是確保 UPS 系統可靠性的關鍵。建議至少每季進行一次完整的測試流程,並保持監控系統的更新。透過這些措施,我們可以建立一個更穩固的電源保護機制,為關鍵系統提供更好的保障。

在維護大型基礎設施時,不間斷電源系統(UPS)的管理至關重要。多年來在建置各種規模的資料中心,玄貓深刻體會到若沒有妥善的 UPS 管理機制,一次意外斷電就可能造成嚴重的系統損害。今天將分享如何透過 NUT(Network UPS Tools)Client 的自動化佈署,建立可靠的電源管理系統。

UPS 管理自動化的重要性

在現代資料中心環境中,手動設定 UPS 管理已不符合效率需求。透過自動化佈署 NUT Client,不僅可以大幅減少人為錯誤,還能確保所有系統都有一致的電源保護機制。

NUT Client 佈署架構設計

在規劃 NUT Client 佈署時,需要考慮幾個關鍵要素:

  1. 中央管理伺服器與客戶端的通訊機制
  2. 斷電時的自動關機流程
  3. 系統監控與警示設定
  4. 許可權管理與安全性設定

Ansible 角色設定重點

建立 NUT Client 的 Ansible 角色時,需要注意以下幾個關鍵設定:

- name: 安裝 NUT Client 套件
  apt:
    name: nut-client
    state: present
  when: ansible_os_family == "Debian"

- name: 設定 NUT Client 設定檔
  template:
    src: upsmon.conf.j2
    dest: /etc/nut/upsmon.conf
    mode: '0640'
  • 第一個任務使用 apt 模組安裝 nut-client 套件,但僅在 Debian 系列作業系統執行
  • 第二個任務將設定範本佈署到正確位置,並設定適當的檔案許可權

設定範本最佳化設計

在建立 upsmon.conf 範本時,需要考慮各種環境需求:

MONITOR ups@master 1 monuser secret master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
  • MONITOR 定義了 UPS 監控的基本引數,包含 UPS 識別名稱、權重和認證資訊
  • MINSUPPLIES 指定最小需要的 UPS 數量
  • SHUTDOWNCMD 設定斷電時的關機指令
  • POLLFREQ 和 POLLFREQALERT 定義了正常和警示狀態下的輪詢頻率

安全性考量與最佳實踐

在佈署 NUT Client 時,安全性是不容忽視的環節:

- name: 設定 NUT Client 存取許可權
  file:
    path: /etc/nut/upsmon.conf
    owner: root
    group: nut
    mode: '0640'

- name: 確保 NUT 服務啟用
  service:
    name: nut-client
    state: started
    enabled: yes
  • 確保設定檔案只能被適當的使用者和群組存取
  • 設定服務自動啟動,確保系統重開機後能自動運作

監控與警示機制

為了確保系統能及時反應電源異常,需要建立完善的監控機制:

- name: 設定監控警示
  template:
    src: notifycmd.j2
    dest: /etc/nut/notifycmd
    mode: '0755'
    owner: root
    group: root
  • 建立客製化的警示指令碼
  • 設定適當的執行許可權
  • 確保警示能即時通知相關人員

佈署流程自動化

完整的佈署流程應包含以下步驟:

- name: 前置檢查
  assert:
    that:
      - nut_server is defined
      - nut_password is defined
    fail_msg: "缺少必要的設定引數"

- name: 佈署 NUT Client
  include_tasks: deploy.yml

- name: 驗證佈署
  include_tasks: verify.yml
  • 在佈署前進行必要的引數檢查
  • 使用模組化的任務檔案組織佈署流程
  • 加入佈署後的驗證機制

在多年的系統維運經驗中,玄貓發現自動化佈署不僅能提升效率,更能確保系統的可靠性。透過精心設計的 Ansible 角色,結合適當的監控機制,能夠建立一個穩固的 UPS 管理環境。在實際佈署時,建議先在測試環境進行完整的驗證,確保所有元件都能正常運作,再逐步推展到生產環境。

記住,良好的電源管理機制是確保系統穩定運作的根本。透過自動化工具的協助,不僅能降低管理成本,更能提供更可靠的服務品質。持續最佳化和調整設定,因應不同環境的需求,才能建立真正堅實的基礎設施。