Monitorare container e addon con Home Assistant
Premessa
Un container Docker è un’unità standard di software che racchiude il codice e tutte le sue dipendenze, in modo che l’applicazione funzioni rapidamente e in modo affidabile da un ambiente di elaborazione ad un altro. Un’immagine del container è un pacchetto software leggero, autonomo e eseguibile che include tutto il necessario per eseguire un’applicazione: codice, runtime, strumenti di sistema, librerie di sistema e impostazioni.
Entrando nel dettaglio Docker utilizza le funzionalità di isolamento delle risorse del kernel Linux come cgroups e namespaces per consentire quindi a “container” software indipendenti di coesistere sulla stessa istanza del sistema operativo Linux (e da non molto tempo esistono anche container nativi Windows).
Hass.io sfrutta le potenzialità dei container Docker per mantenere aggiornato Home Assistant senza la necessità per l’utente finale della CLI (riga di comando) di Linux, inoltre introduce il concetto di addon, i quali non sono altro che ulteriori container Docker, che aggiungono funzionalità al nostro sistema di domotica.
HA-Dockermon
Dopo la premessa veniamo subito al perché di questa guida: non sarebbe interessante controllare e monitorare gli addon di Hass.io ma anche alri container installati attraverso Home Assistant? Philip Hawthorne (https://philhawthorne.com) si è posto la stessa domanda e ha dato anche la risposta: HA-Dockermon.
HA-Dockermon è un servizio NodeJS che può essere eseguito come container Docker (o attraverso NodeJS) che espone un’API RESTful che Home Assistant può chiamare per vedere lo stato dei container. Le principali attività che può eseguire HA-Dockermon sono:
- Ottenere lo stato di un container (running, stop, pause, etc).
- Ottenere informazioni su ogni singolo container gestio da Docker
- Avviare o arrestare un container inviando una richiesta POST
- Avviare o arrestare un container inviando una richiesta GET ad un URL
Per installare HA-Dockermon come container su Docker occorre digitare le seguenti istruzioni su CLI Linux, per chi usa le varie distro Linux anche su Raspberry non ci sono problemi, per chi usa Hass.IO su ResinOS o HassOS occorre aprire una shell del SO come spiegato qui: https://developers.home-assistant.io/docs/en/hassio_debugging.html (questa procedura non è stata testata in quanto non utilizzo HassoOS).
x86/x64
1 2 3 4 5 6 |
docker run -d \ --name=ha-dockermon --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /path/to/config:/config \ -p 8126:8126 \ philhawthorne/ha-dockermon |
Raspberry
1 2 3 4 5 6 |
docker run -d \ --name=ha-dockermon --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /path/to/config:/config \ -p 8126:8126 \ philhawthorne/ha-dockermon:arm |
API RESTful
Le principali API a disposizione sono:
-
-
- GET /container/{container name} – restituisce lo stato del container
- GET /container/{container name}/restart – restart del container
- GET /container/{container name}/start – avvia il container
- GET /container/{container name}/stop – ferma il container
- GET /container/{container name}/unpause – avvia un container in pausa
- GET /container/{container name}/pause – mette in pausa il container
- GET /container/{container name}/stat – restituisce informazioni sul container
- POST /container/{container name}/exec – permette di eseguire comandi all’interno di un container
-
Configurazione HA
Poichè HA-Dockermon espone API RESTful occorre interrogare queste API per ottenere le informazioni che ci interessano, ad esempio per configurare degli switch
in HA per avviare o fermare un container.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
switch: # switch per avviare-fermare Grafana - platform: rest resource: http://127.0.0.1:8126/container/addon_a0d7b954_grafana name: Grafana body_on: '{"state": "start"}' body_off: '{"state": "stop"}' is_on_template: '{{ value_json is not none and value_json.state == "running" }}' # switch per avviare-fermare InfluxDB - platform: rest resource: http://127.0.0.1:8126/container/addon_a0d7b954_influxdb name: InfluxDB body_on: '{"state": "start"}' body_off: '{"state": "stop"}' is_on_template: '{{ value_json is not none and value_json.state == "running" }}' |
Informazione fondamentale per realizzare questi switch
è conoscere l’esatto nome del container da monitorare/controllare.
Oltre alla configurazione manuale degli switch
è possibile sfruttare due custom components che recuperano informazioni da HA-Dockermon ed effettuano il controllo dei container: (da verificare sul campo perché ad alcuni utenti hanno dato dei problemi di funzionamento)
- https://github.com/custom-components/switch.hadockermon
- https://github.com/custom-components/binary_sensor.hadockermon
Package
Il package si basa sulla “configurazione manuale” degli switch
per controllare i container attraverso HA-Dockermon ed è suddiviso in tre sezioni:
- Sezione di customizzazione delle icone
- Sezione di definzione degli switch
- Sezione di automazione per il controllo dei container “critici”
Attraverso l’interfaccia grafica Lovelace è possibile definire quali sono i container che vogliamo assolutamente tenere sotto controllo inserendo il friendly-name
oppure l’ entity_id
negli input_text
a disposizione. Alcune automazioni, la cui logica è illustrata di seguito, hanno il compito di rilvare correttamente i container critici da monitorare, ed inviare le notifiche attraverso il service notify.telegram
(da personalizzare con il proprio servizio di notifica) per avvertire che un container è andato nello stato stop per qualche motivo, compito dell’utente sarà verificare cosa è accaduto.
Il seguente diagramma illustra quale è la logica di funzionamento del sistema:
- se il numero di container critici che si trovano nello stato running è pari a 5 allora lo stato del sistema è “running”
- se il numero di container critici che si trovano nello stato running è inferiore a 5 allora lo stato del sistema è “stopped”
Il componente sensor.container.critici.on
è il template sensor che conteggia costantemente il numero di container critici attivi, su questo sensore sono basate le automazioni che configurano lo stato del sistema, mentre sensor.container_status
è il template sensor che rileva lo stato attuale del sistema (“Running” o “Stopped”).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
sensor: - platform: template sensors: container_status: entity_id: input_select.container_status value_template: '{{ states.input_select.container_status.state}}' friendly_name: 'Status Container Critici' container_critici_on: entity_id: sensor.time value_template: >- {% macro container_acceso() %} {% set domains = ['switch'] %} {% set entity_container_acceso = states.input_select.lista_container_critici.attributes.options | join(', ') %} {{ states | selectattr('domain','in', domains) | selectattr('state','in','on') | selectattr('entity_id','in',entity_container_acceso) | list | count }} {% endmacro %} {{ container_acceso () | int }} friendly_name: 'Numero Container Critici ON' |
Il file in allegato (container.zip) contiene il package e la configurazione Lovelace; questo package ovviamente è solo un punto di partenza, infatti effettua il monitoraggio dello stato di alcuni addon/container ma le personalizzazioni che si possono fare sono notevoli, ne possiamo discutere nel forum di HassioHelp!!
Una risposta.
Ciao, ho provato a seguire la guida, solo che il package da scaricare non c’è, il link non funziona. Si può ripristinare? Grazie