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:

ZustandKriteriumAktion
normalTemperatur < 30°C für mindestens 4 MinutenHinweis beim Wechseln in diesen Zustand senden.
warmTemperatur zwischen 31°C und 37°C für mindestens 4 MinutenHinweis beim Wechseln in diesen Zustand senden.
hotTemperatur zwischen 38°C und 44°C für mindestens 4 MinutenWarnung beim Wechseln in diesen Zustand senden.
alarmTemperatur > 45°C für mindestens 4 MinutenAlarmmeldung beim Wechsel in diesen Zustand senden.
Zustand Alarm für mindestens 7, 13 oder 19 MinutenServer herunterfahren und Alarmmeldung senden.
Zustand Alarm für mindestens 25 MinutenServer 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:

Helper zur Speicherung des Temperatur-Status

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":

ILO-Benutzer anlegen

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:

SSH-Key in ILO-Interface hinterlegen

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

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page