fix(ups): shutdown-ul orchestrat la pana de curent nu functiona deloc
upsmon face fork in doua procese, iar NOTIFYCMD ruleaza in cel neprivilegiat, ca user `nut`: shell nologin, home /var/lib/nut, NICIO cheie SSH. Verificat pe pvemini — pentru `nut`, `qm list`, `pct list` si `ssh root@pve1` esueaza toate. Deci ups-shutdown-cluster.sh nu putea opri niciun guest si nu putea ajunge la niciun nod. Singurul lucru care mergea erau emailurile, pentru care exista deja `nut ALL=(root) NOPASSWD: /usr/bin/perl`. De asta /var/log/ups-shutdown.log nu continea nicio oprire reusita din 2025-10-06 incoace: la fiecare pana de curent se trimiteau emailuri si nu se oprea nimic, iar pve1/pveelite mergeau pana se termina bateria. Reparat: - /etc/sudoers.d/nut-shutdown da userului nut dreptul sa ruleze scriptul ca root - upssched-cmd il invoca prin sudo (liniile 355 si 413) - scriptul refuza sa porneasca daca nu e root, cu mesaj explicit Rescris scriptul: - seteaza shutdown_policy=freeze INAINTE de orice. Fara asta, politica implicita `conditional` transforma fiecare poweroff de nod in failover catre un nod care se stinge si el imediat — exact incidentul 2026-01-11, cu VM 201 migrat in timpul unei pene - guest-urile HA se opresc cu `ha-manager set --state stopped`, nu cu pct/qm shutdown, care din CLI nu actualizeaza state-ul HA - Oracle primeste `shutdown immediate` inainte de oprirea containerului - consumatorii se opresc in paralel, Oracle ultimul - detecteaza lipsa quorumului si cade pe oprire directa, in loc sa blocheze - flock: ONBATT si LOWBATT pot declansa amandoua scriptul - sare peste nodurile care nu raspund la ping in loc sa astepte timeout SSH - timeout pe notificarile email: nu consumam baterie pe SMTP - --dry-run si --force; credentialele UPS pot veni din /etc/nut/ups-shutdown.conf in loc sa fie in script ups-shutdown-test.sh nu mai duplica logica: invoca scriptul real cu --dry-run. Un test cu cod propriu testeaza altceva decat ce ruleaza in realitate. Testat pe pvemini prin lantul complet: sudo -u nut sudo /usr/local/bin/ups-shutdown-cluster.sh --dry-run --force Descopera corect toate cele 11 guest-uri, inclusiv cele de pe pve1 (deci SSH-ul merge), si gaseste shutdown.stayoff pe UPS. RAMANE DE VERIFICAT FIZIC: ups.load e 8%, putin pentru trei servere. Daca pve1 si pveelite nu sunt alimentate din UPS, mor instant la pana si toata orchestrarea e decorativa. Nu se poate verifica din software. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RRyaDj39hPQ89SZS6URRpS
This commit is contained in:
25
proxmox/cluster/ups/config/sudoers.d-nut-shutdown
Normal file
25
proxmox/cluster/ups/config/sudoers.d-nut-shutdown
Normal file
@@ -0,0 +1,25 @@
|
||||
# /etc/sudoers.d/nut-shutdown
|
||||
#
|
||||
# upssched (NOTIFYCMD din upsmon.conf) rulează ca user `nut`, nu ca root:
|
||||
# upsmon face fork în două procese, iar cel care execută NOTIFYCMD e cel
|
||||
# neprivilegiat. Userul `nut` are shell nologin, home /var/lib/nut și NICIO
|
||||
# cheie SSH.
|
||||
#
|
||||
# Fără regulile de aici, shutdown-ul orchestrat NU poate face nimic:
|
||||
# - `pct` / `qm` / `ha-manager` -> permission denied
|
||||
# - `ssh root@pve1 ...` -> nut nu are chei
|
||||
# - `shutdown` / `systemctl poweroff` -> permission denied
|
||||
# Singurul lucru care funcționa era trimiterea emailurilor, pentru care exista
|
||||
# deja regula `nut ALL=(root) NOPASSWD: /usr/bin/perl` din /etc/sudoers.d/nut.
|
||||
# De asta /var/log/ups-shutdown.log nu conținea nicio oprire reușită.
|
||||
#
|
||||
# Instalare:
|
||||
# cp sudoers.d-nut-shutdown /etc/sudoers.d/nut-shutdown
|
||||
# chmod 440 /etc/sudoers.d/nut-shutdown
|
||||
# visudo -c # verificare sintaxă, obligatorie
|
||||
#
|
||||
# Un path fără argumente în sudoers permite orice argumente pentru acel
|
||||
# executabil — deci `--dry-run` și `--force` funcționează cu aceeași regulă.
|
||||
|
||||
nut ALL=(root) NOPASSWD: /usr/local/bin/ups-shutdown-cluster.sh
|
||||
nut ALL=(root) NOPASSWD: /usr/local/bin/ups-shutdown-test.sh
|
||||
Reference in New Issue
Block a user