Temperaturüberwachung für Server-Schrank (Teil 3)
Für die Temperaturüberwachung in einem Server-Schrank wurde im ersten Teil der Artikelserie I2C-Sensoren über USB an das Linux-System angebunden und ausgelesen. Im letzten Teil wurden die Daten dann in Home Assistant bereitgestellt und wir werden informiert, wenn der Sensor ausfällt. Jetzt fehlt noch die Alarmierung wenn die Temperatur in einen ungünstigen Bereich kommt.
Es wird davon ausgegangen, dass Home Assistant und ein MQTT-Broker (z.B. mosquitto) bereits erfolgreich eingerichtet sind. Außerdem sollte der erste und der zweite Teil der Artikelserie bereits umgesetzt sein. Für die Alarmierung sollte mindestens ein Notifier-Dienst in Home Assistant konfiguriert sein.
1| Temperaturbereiche und Aktionen
Zunächst sind Temperaturbereiche zu definieren in denen jeweils eine unterschiedliche Aktionen ausgelöst werden. Die folgende Tabelle gibt eine Übersicht über die Temperaturbereiche und die zugehörigen Aktionen:
Zustand | Kriterium | Aktion |
normal | Temperatur < 30°C für mindestens 4 Minuten | Hinweis beim Wechseln in diesen Zustand senden. |
warm | Temperatur zwischen 31°C und 37°C für mindestens 4 Minuten | Hinweis beim Wechseln in diesen Zustand senden. |
hot | Temperatur zwischen 38°C und 44°C für mindestens 4 Minuten | Warnung beim Wechseln in diesen Zustand senden. |
alarm | Temperatur > 45°C für mindestens 4 Minuten | Alarmmeldung beim Wechsel in diesen Zustand senden. |
Zustand Alarm für mindestens 7, 13 oder 19 Minuten | Server herunterfahren und Alarmmeldung senden. | |
Zustand Alarm für mindestens 25 Minuten | Server hart ausschalten und Alarmmeldung senden. |
Zwischen den jeweiligen Temperaturbereich wurden bewusst immer eine "Lücke" von 1°C gelassen. Dadurch soll vermieden werden, dass bei Temperaturen um eine Grenze ständig eine Meldung geschickt wird, wenn mit der einen Messung der Grenzwert überschritten wird und mit der nächsten Messung dann der Grenzwert wieder unterschritten wird.
Um die Wahrscheinlichkeit für unnötige Alarme weiter zu reduzieren, sollte eine Aktualisierung des Zustandes erst dann erfolgen, wenn mindestens zwei Messungen nacheinander über den Schwellwert liegen. Daher jeweils die Einschränkung "für mindestens 4 Minuten".
2| Status-Helper einrichten
Damit wir jeweils nur beim Wechsel in einen bestimmten Zustand eine Aktion auslösen und nicht bei jeder Aktualisierung der Temperatur, wird zunächst ein Helper unter Configuration > Helper
eingerichtet mit dessen Hilfe der jeweilige Zustand in Home Assistant gespeichert wird:
3| Automatisierungen für den Statuswechsel
Der Status wird mit Automations gesetzt. Damit der Status erst gesetzt wird, wenn mindestens zwei Messungen oberhalb der Grenze liegen, wird beim Trigger jeweils der Paramter for: '00:03:30'
gesetzt. Insgesamt müssen vier Automations angelegt werden:
alias: 'Serverrack: Set status normal'
description: >-
Wenn die Temperatur für mindestens 3:§0 Minuten unter 30°C fällt, wird der
Status auf "normal" zurückgesetzt.
trigger:
- platform: numeric_state
entity_id: sensor.temperature_rack
below: '30'
for: '00:03:30'
condition:
- condition: not
conditions:
- condition: state
entity_id: input_select.serverrack_temperaturstatus
state: normal
action:
- service: input_select.select_option
data:
option: normal
entity_id: input_select.serverrack_temperaturstatus
- service: notify.pushover
data:
title: Temperatur-Hinweis
message: >-
Server-Rack im Büro ist wieder im Status 'normal' ({{
states('sensor.temperature_rack') }}°C)!
mode: single
alias: 'Serverrack: Set status warm'
description: >-
Wenn die Temperatur für mindestens 3:30 Minuten zwischen 31°C und 37°C liegt,
wird der Status auf "warm" gesetzt.
trigger:
- platform: numeric_state
entity_id: sensor.temperature_rack
for: '00:07:00'
above: '31'
below: '37'
condition:
- condition: not
conditions:
- condition: state
entity_id: input_select.serverrack_temperaturstatus
state: warm
action:
- service: input_select.select_option
data:
option: warm
entity_id: input_select.serverrack_temperaturstatus
- service: notify.pushover
data:
title: Temperatur-Hinweis
message: >-
Server-Rack im Büro ist im Status 'warm' ({{
states('sensor.temperature_rack') }}°C)!
mode: single
alias: 'Serverrack: Set status hot'
description: >-
Wenn die Temperatur für mindestens 3:30 Minuten zwischen 38°C und 44°C liegt
wird der Status auf "hot" gesetzt.
trigger:
- platform: numeric_state
entity_id: sensor.temperature_rack
for: '00:03:30'
above: '38'
below: '44'
condition:
- condition: not
conditions:
- condition: state
entity_id: input_select.serverrack_temperaturstatus
state: hot
action:
- service: input_select.select_option
data:
option: hot
entity_id: input_select.serverrack_temperaturstatus
- service: notify.pushover
data:
title: Temperatur-Warnung
message: >-
WARNUNG: Server Rack im Büro ist im Status 'hot' ({{
states('sensor.temperature_rack') }}°C)!
target:
- oneplus
data:
priority: 1
mode: single
alias: 'Serverrack: Set status alarm'
description: >-
Wenn die Temperatur für mindestens 3:30 Minuten über 45°C liegt wird der Status
auf "alarm" gesetzt.
trigger:
- platform: numeric_state
entity_id: sensor.temperature_rack
for: '00:03:30'
above: '45'
condition:
- condition: not
conditions:
- condition: state
entity_id: input_select.serverrack_temperaturstatus
state: alarm
action:
- service: input_select.select_option
data:
option: alarm
entity_id: input_select.serverrack_temperaturstatus
- service: notify.pushover
data:
title: Temperatur-Alarm
message: >-
ACHTUNG: Server Rack im Büro ist im Status 'alarm' ({{
states('sensor.temperature_rack') }}°C)!
data:
priority: 2
mode: single
Mit diesen Automatisierungen wurde auch gleichzeitig die Alarmierung für die Status-Wechsel implementiert. Was jetzt noch fehlt ist die Notabschaltung des Servers.
4| Server herunterfahren
Die Haupt-Wärmequelle in meinem Server-Schrank ist wohl der HP Microserver Gen8. Dieser hat eine ILO-Schnittstelle über die der Server Remote an- und auch wieder ausgeschaltet werden kann. Die Kommandos können dabei auch über SSH ausgeführt werden - perfekt also für die Automatisierung mit Home Assistant.
Zunächst muss ein neuer Benutzer im ILO-Interface unter Administration > User Administration
eingerichtet werden. Dieser Benutzer benötigt dabei lediglich die Berechtigungen "Virtual Power and Reset":
Danach ist für diesen Benutzer noch ein SSH-Public-Key zu hinterlegen. Dazu muss zunächst ein Schlüssel für den Service-User, unter dem Home Assistant ausgeführt wird, erzeugt werden. Dazu muss das Kommand sudo -u hass ssh-keygen -b 2048 -t rsa
ausgeführt werden. Leider unterstützt das ILO-Interface scheinbar keine längeren Schlüssel als 2048 Bit. Daher muss die Schlüssellänge leider eingeschränkt werden
Hinweis: Der Name des Service Users, unter dem Home Assistant ausgeführt wird, kann von meinem Beispiel (hass
) abweichen. Im Zweifelsfall kann der User-Name mit dem Befehl ps aux | grep homeassistant
ermittelt werden.
Der Inhalt der Datei .ssh/id_rsa.pub
im Home-Directory des hass-Users wird anschließend im ILO-Management-Interface unter Administration > Security
für den gerade angelegten Benutzer hass
hinterlegt:
Jetzt kann der SSH-Zugang zum ILO ausprobiert werden. Dazu wird auf dem Home Assistant-Server um Kontext des Home Assistant Benutzers zunächst eine Verbindung zum ILO-Interface aufgebaut, damit der SSH-Server-Key bestätigt werden kann:
sudo -u hass ssh hass@ilo
The authenticity of host 'ilo (192.168.178.20)' can't be established.
RSA key fingerprint is SHA256:MQX3abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMN.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ilo' (RSA) to the list of known hosts.
User:hass logged-in to ilo.lan(192.168.178.20)
iLO Advanced 2.xx at xxx yy 20zz
Server Name: server
Server Power: On
</>hpiLO-> exit
status=0
status_tag=COMMAND COMPLETED
Sun Mar 14 17:16:43 2021
CLI session stopped
Received disconnect from 192.168.178.20 port 22:11: Client Disconnect
Disconnected from 192.168.178.20 port 22
Die Bestätigung des Host-Keys ist dabei ein wichtiger Punkt, damit der Server-Key in der known_hosts
Datei des hass
-Users gespeichert wird und anschließend beim Verbindungsaufbau nicht erneut bestätigt werden muss. Ansonsten klappt das automatische Login später nicht.
Jetzt wird ein Command-Line-Switch in der configuration.yaml
im Abschnitt switch
angelegt werden, mit dem über Home Assistant der Server heruntergefahren und eingeschaltet werden kann:
switch:
- platform: command_line
switches:
server_softpower:
command_on: '/usr/bin/ssh ilo POWER on'
command_off: '/usr/bin/ssh ilo POWER off'
command_state: '/usr/bin/ssh ilo POWER | /bin/grep "currently: On"'
friendly_name: Server Power (Soft)
Damit die Konfiguration wirksam wird, muss Home Assistant neu gestartet werden.
Mit dem Schalter kann das Herunterfahren des Servers in einer Automation getriggert werden:
alias: 'Serverrack: Emergency Server Power Off (Soft)'
description: >-
Bleibt die Temperatur für längere Zeit im kritischen Bereich, wird ein
automatischer Server-Shutdown ausgelöst werden
trigger:
- platform: state
entity_id: input_select.serverrack_temperaturstatus
to: alarm
for: '00:07:00'
- platform: state
entity_id: input_select.serverrack_temperaturstatus
for: '00:13:00'
to: alarm
- platform: state
entity_id: input_select.serverrack_temperaturstatus
for: '00:19:00'
to: alarm
condition:
- condition: state
entity_id: switch.server_softpower
state: 'on'
action:
- service: notify.pushover
data:
title: Emergency Server Shutdown
message: >-
Versuche Server herunterzufahren, Temperatur im Server Rack zu hoch ({{
states('sensor.temperature_rack') }}°C)!
data:
priority: 1
- service: switch.turn_off
data: {}
entity_id: switch.server_softpower
mode: single
Die obige Auomatisierung sollte dabei drei Versuche starten
5| Server ausschalten
Fällt die Temperatur trotz Soft-Power-Off immer noch nicht, müssen härtere Geschütze aufgefahren werden: In der nächsten Eskalationsstufe wird ein harter Power-Off über das ILO-Interface versucht.
Dazu wird zunächst wieder ein Switch eingerichtet. Diesmal soll der Rechner aber hart ausgeschaltet werden - also vergleichbar zu einem Drücken des Power-Knopfes am Server für 6 Sekunden:
switch:
- platform: command_line
switches:
server_hardpower:
command_on: '/usr/bin/ssh ilo POWER on'
command_off: '/usr/bin/ssh ilo POWER off hard'
command_state: '/usr/bin/ssh ilo POWER | /bin/grep "currently: On"'
friendly_name: Server Power (Hard)
Damit die Konfiguration wirksam wird, muss Home Assistant neu gestartet werden.
Hinweis: Sollte der Server kein ILO-Interface haben, oder soll noch eine zusätzliche Eskalationsstufe eingebaut werden, so kann natürlich auch noch eine schaltbare Steckdose verwendet werden um den Server oder gleich das ganze Server-Rack Stromlos zu nehmen.
Die zugehörige Automation wird gestartet, wenn die Temperatur für 25 Minuten über 45 °C ist:
alias: 'Serverrack: Emergency Server Power Off (Hard)'
description: >-
Bleibt die Temperatur für längere Zeit im kritischen Bereich, so wird der Server
hart ausgeschaltet (via ILO).
trigger:
- platform: state
entity_id: input_select.serverrack_temperaturstatus
to: alarm
for: '00:25:00'
condition:
- condition: state
entity_id: switch.server_hardpower
state: 'on'
action:
- service: notify.pushover
data:
title: Emergency Server Shutdown
message: >-
WARNUNG: Schalte Server aus, da Temperatur im Server Rack zu hoch ({{
states('sensor.temperature_rack') }}°C)!
data:
priority: 1
- service: switch.turn_off
data: {}
entity_id: switch.server_hardpower
mode: single
6| Nachricht senden wenn der Server aus ist
Zu guter letzt soll eine Nachricht gesendet werden, wenn der Server heruntergefahren oder ausgeschaltet werden konnte :
alias: 'Serverrack: Notify succesful Server Shutdown'
description: >-
Wenn der Server erfolgreich heruntergefahren oder ausgeschaltet wurde, soll
eine Nachricht gesendet werden.
trigger:
- platform: state
entity_id: switch.server_softpower
to: 'off'
- platform: state
entity_id: switch.server_hardpower
to: 'off'
condition:
- condition: or
conditions:
- condition: state
entity_id: input_select.serverrack_temperaturstatus
state: alarm
- condition: state
entity_id: input_select.serverrack_temperaturstatus
state: hot
action:
- service: notify.pushover
data:
title: Emergency Server Shutdown
message: >-
Server ausgeschaltet. Aktuelle Temperatur im Rack: ({{
states('sensor.temperature_rack') }}°C)!
data:
priority: 0
mode: single
Jetzt sollten die wichtigsten Funktionen der Temperaturüberwachung bereits umgesetzt sein. Was noch fehlt ist die optische Warnung durch die RGB-LEDs. Die wird im nächsten Artikel eingerichtet.
Kommentare