Enhance host status tracking by parsing Ansible PLAY RECAP to update host reachability and last_seen timestamps after health-check playbook executions, add inventory group resolution to host API responses, and trigger automatic data refresh in dashboard after task completion to reflect updated host health indicators
Tests / Backend Tests (Python) (3.10) (push) Has been cancelled
Tests / Backend Tests (Python) (3.11) (push) Has been cancelled
Tests / Backend Tests (Python) (3.12) (push) Has been cancelled
Tests / Frontend Tests (JS) (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / All Tests Passed (push) Has been cancelled

This commit is contained in:
2025-12-22 10:43:17 -05:00
parent 6c51fb5c75
commit 46823eb42d
15 changed files with 1161 additions and 8 deletions
File diff suppressed because one or more lines are too long
@@ -0,0 +1,58 @@
# ✅ Vérification de santé
## Informations
| Propriété | Valeur |
|-----------|--------|
| **ID** | `13e2b84be54a41eb945785378b60f5f6` |
| **Nom** | Vérification de santé |
| **Cible** | `ali2v.xeon.home` |
| **Statut** | completed |
| **Type** | Manuel |
| **Progression** | 100% |
| **Début** | 2025-12-22T02:16:51.460152+00:00 |
| **Fin** | 2025-12-22T02:16:59.573843+00:00 |
| **Durée** | 8.1s |
## Sortie
```
Using /mnt/c/dev/git/python/homelab-automation-api-v2/ansible/ansible.cfg as config file
PLAY [Health check on target host] *********************************************
TASK [Check if host is reachable (ping)] ***************************************
ok: [ali2v.xeon.home] => {"changed": false, "ping": "pong"}
TASK [Gather minimal facts] ****************************************************
ok: [ali2v.xeon.home]
TASK [Get system uptime] *******************************************************
ok: [ali2v.xeon.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.002844", "end": "2025-12-21 21:16:55.811614", "msg": "", "rc": 0, "start": "2025-12-21 21:16:55.808770", "stderr": "", "stderr_lines": [], "stdout": " 21:16:55 up 1 day, 22:16, 1 user, load average: 0.07, 0.26, 0.30", "stdout_lines": [" 21:16:55 up 1 day, 22:16, 1 user, load average: 0.07, 0.26, 0.30"]}
TASK [Get disk usage] **********************************************************
ok: [ali2v.xeon.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.004099", "end": "2025-12-21 21:16:56.243269", "msg": "", "rc": 0, "start": "2025-12-21 21:16:56.239170", "stderr": "", "stderr_lines": [], "stdout": "22%", "stdout_lines": ["22%"]}
TASK [Get memory usage (Linux)] ************************************************
ok: [ali2v.xeon.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.004345", "end": "2025-12-21 21:16:56.958250", "msg": "", "rc": 0, "start": "2025-12-21 21:16:56.953905", "stderr": "", "stderr_lines": [], "stdout": "20.6%", "stdout_lines": ["20.6%"]}
TASK [Get CPU temperature (ARM/SBC)] *******************************************
ok: [ali2v.xeon.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.004879", "end": "2025-12-21 21:16:57.736676", "msg": "", "rc": 0, "start": "2025-12-21 21:16:57.731797", "stderr": "", "stderr_lines": [], "stdout": "45.0°C", "stdout_lines": ["45.0°C"]}
TASK [Get CPU load] ************************************************************
ok: [ali2v.xeon.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.004063", "end": "2025-12-21 21:16:58.470317", "msg": "", "rc": 0, "start": "2025-12-21 21:16:58.466254", "stderr": "", "stderr_lines": [], "stdout": "0.06", "stdout_lines": ["0.06"]}
TASK [Display health status] ***************************************************
ok: [ali2v.xeon.home] => {
"msg": "═══════════════════════════════════════\nHost: ali2v.xeon.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 21:16:55 up 1 day, 22:16, 1 user, load average: 0.07, 0.26, 0.30\nDisk Usage: 22%\nMemory Usage: 20.6%\nCPU Load: 0.06\nCPU Temp: 45.0°C\n═══════════════════════════════════════\n"
}
PLAY RECAP *********************************************************************
ali2v.xeon.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
```
---
*Généré automatiquement par Homelab Automation Dashboard*
*Date: 2025-12-22T02:16:59.680539+00:00*
@@ -0,0 +1,69 @@
# ✅ Playbook: Health Check
## Informations
| Propriété | Valeur |
|-----------|--------|
| **ID** | `pb_4e00871ceb5d` |
| **Nom** | Playbook: Health Check |
| **Cible** | `env_lab` |
| **Statut** | completed |
| **Type** | Manuel |
| **Progression** | 100% |
| **Début** | 2025-12-22T02:18:41.245690+00:00 |
| **Fin** | 2025-12-22T02:18:50.313464+00:00 |
| **Durée** | 9.7s |
## Sortie
```
Using /mnt/c/dev/git/python/homelab-automation-api-v2/ansible/ansible.cfg as config file
PLAY [Health check on target host] *********************************************
TASK [Check if host is reachable (ping)] ***************************************
ok: [dev.lab.home] => {"changed": false, "ping": "pong"}
ok: [media.labb.home] => {"changed": false, "ping": "pong"}
TASK [Gather minimal facts] ****************************************************
ok: [dev.lab.home]
ok: [media.labb.home]
TASK [Get system uptime] *******************************************************
ok: [dev.lab.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.002993", "end": "2025-12-21 21:18:46.738790", "msg": "", "rc": 0, "start": "2025-12-21 21:18:46.735797", "stderr": "", "stderr_lines": [], "stdout": " 21:18:46 up 3:33, 0 user, load average: 0.09, 0.18, 0.17", "stdout_lines": [" 21:18:46 up 3:33, 0 user, load average: 0.09, 0.18, 0.17"]}
ok: [media.labb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.003514", "end": "2025-12-21 21:18:08.052826", "msg": "", "rc": 0, "start": "2025-12-21 21:18:08.049312", "stderr": "", "stderr_lines": [], "stdout": " 21:18:08 up 22 days, 5:20, 0 user, load average: 0.00, 0.02, 0.00", "stdout_lines": [" 21:18:08 up 22 days, 5:20, 0 user, load average: 0.00, 0.02, 0.00"]}
TASK [Get disk usage] **********************************************************
ok: [dev.lab.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.005481", "end": "2025-12-21 21:18:47.378500", "msg": "", "rc": 0, "start": "2025-12-21 21:18:47.373019", "stderr": "", "stderr_lines": [], "stdout": "50%", "stdout_lines": ["50%"]}
ok: [media.labb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.005819", "end": "2025-12-21 21:18:08.717887", "msg": "", "rc": 0, "start": "2025-12-21 21:18:08.712068", "stderr": "", "stderr_lines": [], "stdout": "25%", "stdout_lines": ["25%"]}
TASK [Get memory usage (Linux)] ************************************************
ok: [dev.lab.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.005529", "end": "2025-12-21 21:18:48.084897", "msg": "", "rc": 0, "start": "2025-12-21 21:18:48.079368", "stderr": "", "stderr_lines": [], "stdout": "77.2%", "stdout_lines": ["77.2%"]}
ok: [media.labb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.004326", "end": "2025-12-21 21:18:09.398504", "msg": "", "rc": 0, "start": "2025-12-21 21:18:09.394178", "stderr": "", "stderr_lines": [], "stdout": "60.4%", "stdout_lines": ["60.4%"]}
TASK [Get CPU temperature (ARM/SBC)] *******************************************
ok: [dev.lab.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.002563", "end": "2025-12-21 21:18:48.724451", "msg": "", "rc": 0, "start": "2025-12-21 21:18:48.721888", "stderr": "", "stderr_lines": [], "stdout": "N/A", "stdout_lines": ["N/A"]}
ok: [media.labb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.003053", "end": "2025-12-21 21:18:10.054191", "msg": "", "rc": 0, "start": "2025-12-21 21:18:10.051138", "stderr": "", "stderr_lines": [], "stdout": "N/A", "stdout_lines": ["N/A"]}
TASK [Get CPU load] ************************************************************
ok: [dev.lab.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.004795", "end": "2025-12-21 21:18:49.383952", "msg": "", "rc": 0, "start": "2025-12-21 21:18:49.379157", "stderr": "", "stderr_lines": [], "stdout": "0.09", "stdout_lines": ["0.09"]}
ok: [media.labb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.005060", "end": "2025-12-21 21:18:10.713741", "msg": "", "rc": 0, "start": "2025-12-21 21:18:10.708681", "stderr": "", "stderr_lines": [], "stdout": "0.00", "stdout_lines": ["0.00"]}
TASK [Display health status] ***************************************************
ok: [dev.lab.home] => {
"msg": "═══════════════════════════════════════\nHost: dev.lab.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 21:18:46 up 3:33, 0 user, load average: 0.09, 0.18, 0.17\nDisk Usage: 50%\nMemory Usage: 77.2%\nCPU Load: 0.09\nCPU Temp: N/A\n═══════════════════════════════════════\n"
}
ok: [media.labb.home] => {
"msg": "═══════════════════════════════════════\nHost: media.labb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 21:18:08 up 22 days, 5:20, 0 user, load average: 0.00, 0.02, 0.00\nDisk Usage: 25%\nMemory Usage: 60.4%\nCPU Load: 0.00\nCPU Temp: N/A\n═══════════════════════════════════════\n"
}
PLAY RECAP *********************************************************************
dev.lab.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
media.labb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
```
---
*Généré automatiquement par Homelab Automation Dashboard*
*Date: 2025-12-22T02:18:50.322512+00:00*
@@ -0,0 +1,69 @@
# ✅ Playbook: Health Check
## Informations
| Propriété | Valeur |
|-----------|--------|
| **ID** | `pb_f8b6e41ff159` |
| **Nom** | Playbook: Health Check |
| **Cible** | `env_lab` |
| **Statut** | completed |
| **Type** | Manuel |
| **Progression** | 100% |
| **Début** | 2025-12-22T02:44:52.164420+00:00 |
| **Fin** | 2025-12-22T02:45:04.128027+00:00 |
| **Durée** | 11.9s |
## Sortie
```
Using /mnt/c/dev/git/python/homelab-automation-api-v2/ansible/ansible.cfg as config file
PLAY [Health check on target host] *********************************************
TASK [Check if host is reachable (ping)] ***************************************
ok: [dev.lab.home] => {"changed": false, "ping": "pong"}
ok: [media.labb.home] => {"changed": false, "ping": "pong"}
TASK [Gather minimal facts] ****************************************************
ok: [dev.lab.home]
ok: [media.labb.home]
TASK [Get system uptime] *******************************************************
ok: [dev.lab.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.002863", "end": "2025-12-21 21:44:59.687460", "msg": "", "rc": 0, "start": "2025-12-21 21:44:59.684597", "stderr": "", "stderr_lines": [], "stdout": " 21:44:59 up 3:59, 0 user, load average: 0.13, 0.16, 0.17", "stdout_lines": [" 21:44:59 up 3:59, 0 user, load average: 0.13, 0.16, 0.17"]}
ok: [media.labb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.003623", "end": "2025-12-21 21:44:21.007560", "msg": "", "rc": 0, "start": "2025-12-21 21:44:21.003937", "stderr": "", "stderr_lines": [], "stdout": " 21:44:21 up 22 days, 5:46, 0 user, load average: 0.15, 0.05, 0.01", "stdout_lines": [" 21:44:21 up 22 days, 5:46, 0 user, load average: 0.15, 0.05, 0.01"]}
TASK [Get disk usage] **********************************************************
ok: [dev.lab.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.005219", "end": "2025-12-21 21:45:00.423346", "msg": "", "rc": 0, "start": "2025-12-21 21:45:00.418127", "stderr": "", "stderr_lines": [], "stdout": "50%", "stdout_lines": ["50%"]}
ok: [media.labb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.005561", "end": "2025-12-21 21:44:21.744850", "msg": "", "rc": 0, "start": "2025-12-21 21:44:21.739289", "stderr": "", "stderr_lines": [], "stdout": "25%", "stdout_lines": ["25%"]}
TASK [Get memory usage (Linux)] ************************************************
ok: [dev.lab.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.003939", "end": "2025-12-21 21:45:01.130170", "msg": "", "rc": 0, "start": "2025-12-21 21:45:01.126231", "stderr": "", "stderr_lines": [], "stdout": "77.3%", "stdout_lines": ["77.3%"]}
ok: [media.labb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.004259", "end": "2025-12-21 21:44:22.460821", "msg": "", "rc": 0, "start": "2025-12-21 21:44:22.456562", "stderr": "", "stderr_lines": [], "stdout": "60.2%", "stdout_lines": ["60.2%"]}
TASK [Get CPU temperature (ARM/SBC)] *******************************************
ok: [dev.lab.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.002817", "end": "2025-12-21 21:45:01.803874", "msg": "", "rc": 0, "start": "2025-12-21 21:45:01.801057", "stderr": "", "stderr_lines": [], "stdout": "N/A", "stdout_lines": ["N/A"]}
ok: [media.labb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.003187", "end": "2025-12-21 21:44:23.165750", "msg": "", "rc": 0, "start": "2025-12-21 21:44:23.162563", "stderr": "", "stderr_lines": [], "stdout": "N/A", "stdout_lines": ["N/A"]}
TASK [Get CPU load] ************************************************************
ok: [dev.lab.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.004399", "end": "2025-12-21 21:45:02.508423", "msg": "", "rc": 0, "start": "2025-12-21 21:45:02.504024", "stderr": "", "stderr_lines": [], "stdout": "0.12", "stdout_lines": ["0.12"]}
ok: [media.labb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.004939", "end": "2025-12-21 21:44:23.843717", "msg": "", "rc": 0, "start": "2025-12-21 21:44:23.838778", "stderr": "", "stderr_lines": [], "stdout": "0.15", "stdout_lines": ["0.15"]}
TASK [Display health status] ***************************************************
ok: [media.labb.home] => {
"msg": "═══════════════════════════════════════\nHost: media.labb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 21:44:21 up 22 days, 5:46, 0 user, load average: 0.15, 0.05, 0.01\nDisk Usage: 25%\nMemory Usage: 60.2%\nCPU Load: 0.15\nCPU Temp: N/A\n═══════════════════════════════════════\n"
}
ok: [dev.lab.home] => {
"msg": "═══════════════════════════════════════\nHost: dev.lab.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 21:44:59 up 3:59, 0 user, load average: 0.13, 0.16, 0.17\nDisk Usage: 50%\nMemory Usage: 77.3%\nCPU Load: 0.12\nCPU Temp: N/A\n═══════════════════════════════════════\n"
}
PLAY RECAP *********************************************************************
dev.lab.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
media.labb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
```
---
*Généré automatiquement par Homelab Automation Dashboard*
*Date: 2025-12-22T02:45:04.136628+00:00*
@@ -0,0 +1,80 @@
# ✅ Playbook: Health Check
## Informations
| Propriété | Valeur |
|-----------|--------|
| **ID** | `pb_35848579687b` |
| **Nom** | Playbook: Health Check |
| **Cible** | `role_sbc` |
| **Statut** | completed |
| **Type** | Manuel |
| **Progression** | 100% |
| **Début** | 2025-12-22T03:04:43.692808+00:00 |
| **Fin** | 2025-12-22T03:05:04.816419+00:00 |
| **Durée** | 21.1s |
## Sortie
```
Using /mnt/c/dev/git/python/homelab-automation-api-v2/ansible/ansible.cfg as config file
PLAY [Health check on target host] *********************************************
TASK [Check if host is reachable (ping)] ***************************************
ok: [raspi.8gb.home] => {"changed": false, "ping": "pong"}
ok: [raspi.4gb.home] => {"changed": false, "ping": "pong"}
ok: [orangepi.pc.home] => {"changed": false, "ping": "pong"}
TASK [Gather minimal facts] ****************************************************
ok: [raspi.8gb.home]
ok: [raspi.4gb.home]
ok: [orangepi.pc.home]
TASK [Get system uptime] *******************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.008297", "end": "2025-12-21 22:04:55.585526", "msg": "", "rc": 0, "start": "2025-12-21 22:04:55.577229", "stderr": "", "stderr_lines": [], "stdout": " 22:04:55 up 198 days, 13:37, 1 user, load average: 0.14, 0.16, 0.11", "stdout_lines": [" 22:04:55 up 198 days, 13:37, 1 user, load average: 0.14, 0.16, 0.11"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.009138", "end": "2025-12-21 22:04:55.658156", "msg": "", "rc": 0, "start": "2025-12-21 22:04:55.649018", "stderr": "", "stderr_lines": [], "stdout": " 22:04:55 up 198 days, 13:37, 1 user, load average: 0.34, 0.23, 0.20", "stdout_lines": [" 22:04:55 up 198 days, 13:37, 1 user, load average: 0.34, 0.23, 0.20"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.019335", "end": "2025-12-21 22:04:56.303262", "msg": "", "rc": 0, "start": "2025-12-21 22:04:56.283927", "stderr": "", "stderr_lines": [], "stdout": " 22:04:56 up 19 days, 11:31, 1 user, load average: 0.29, 0.16, 0.11", "stdout_lines": [" 22:04:56 up 19 days, 11:31, 1 user, load average: 0.29, 0.16, 0.11"]}
TASK [Get disk usage] **********************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.011907", "end": "2025-12-21 22:04:57.332665", "msg": "", "rc": 0, "start": "2025-12-21 22:04:57.320758", "stderr": "", "stderr_lines": [], "stdout": "3%", "stdout_lines": ["3%"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.016772", "end": "2025-12-21 22:04:57.388120", "msg": "", "rc": 0, "start": "2025-12-21 22:04:57.371348", "stderr": "", "stderr_lines": [], "stdout": "6%", "stdout_lines": ["6%"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.025342", "end": "2025-12-21 22:04:57.991044", "msg": "", "rc": 0, "start": "2025-12-21 22:04:57.965702", "stderr": "", "stderr_lines": [], "stdout": "21%", "stdout_lines": ["21%"]}
TASK [Get memory usage (Linux)] ************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.010925", "end": "2025-12-21 22:04:58.963435", "msg": "", "rc": 0, "start": "2025-12-21 22:04:58.952510", "stderr": "", "stderr_lines": [], "stdout": "6.8%", "stdout_lines": ["6.8%"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.011741", "end": "2025-12-21 22:04:58.999650", "msg": "", "rc": 0, "start": "2025-12-21 22:04:58.987909", "stderr": "", "stderr_lines": [], "stdout": "13.1%", "stdout_lines": ["13.1%"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.025349", "end": "2025-12-21 22:04:59.630074", "msg": "", "rc": 0, "start": "2025-12-21 22:04:59.604725", "stderr": "", "stderr_lines": [], "stdout": "21.0%", "stdout_lines": ["21.0%"]}
TASK [Get CPU temperature (ARM/SBC)] *******************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.011633", "end": "2025-12-21 22:05:00.568277", "msg": "", "rc": 0, "start": "2025-12-21 22:05:00.556644", "stderr": "", "stderr_lines": [], "stdout": "31.6°C", "stdout_lines": ["31.6°C"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.012898", "end": "2025-12-21 22:05:00.623881", "msg": "", "rc": 0, "start": "2025-12-21 22:05:00.610983", "stderr": "", "stderr_lines": [], "stdout": "35.5°C", "stdout_lines": ["35.5°C"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.028697", "end": "2025-12-21 22:05:01.252436", "msg": "", "rc": 0, "start": "2025-12-21 22:05:01.223739", "stderr": "", "stderr_lines": [], "stdout": "35.7°C", "stdout_lines": ["35.7°C"]}
TASK [Get CPU load] ************************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.010036", "end": "2025-12-21 22:05:02.249747", "msg": "", "rc": 0, "start": "2025-12-21 22:05:02.239711", "stderr": "", "stderr_lines": [], "stdout": "0.13", "stdout_lines": ["0.13"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.011128", "end": "2025-12-21 22:05:02.279561", "msg": "", "rc": 0, "start": "2025-12-21 22:05:02.268433", "stderr": "", "stderr_lines": [], "stdout": "0.31", "stdout_lines": ["0.31"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.024624", "end": "2025-12-21 22:05:02.902166", "msg": "", "rc": 0, "start": "2025-12-21 22:05:02.877542", "stderr": "", "stderr_lines": [], "stdout": "0.34", "stdout_lines": ["0.34"]}
TASK [Display health status] ***************************************************
ok: [orangepi.pc.home] => {
"msg": "═══════════════════════════════════════\nHost: orangepi.pc.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 22:04:56 up 19 days, 11:31, 1 user, load average: 0.29, 0.16, 0.11\nDisk Usage: 21%\nMemory Usage: 21.0%\nCPU Load: 0.34\nCPU Temp: 35.7°C\n═══════════════════════════════════════\n"
}
ok: [raspi.4gb.home] => {
"msg": "═══════════════════════════════════════\nHost: raspi.4gb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 22:04:55 up 198 days, 13:37, 1 user, load average: 0.34, 0.23, 0.20\nDisk Usage: 6%\nMemory Usage: 13.1%\nCPU Load: 0.31\nCPU Temp: 35.5°C\n═══════════════════════════════════════\n"
}
ok: [raspi.8gb.home] => {
"msg": "═══════════════════════════════════════\nHost: raspi.8gb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 22:04:55 up 198 days, 13:37, 1 user, load average: 0.14, 0.16, 0.11\nDisk Usage: 3%\nMemory Usage: 6.8%\nCPU Load: 0.13\nCPU Temp: 31.6°C\n═══════════════════════════════════════\n"
}
PLAY RECAP *********************************************************************
orangepi.pc.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi.4gb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi.8gb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
```
---
*Généré automatiquement par Homelab Automation Dashboard*
*Date: 2025-12-22T03:05:04.836981+00:00*
@@ -0,0 +1,80 @@
# ✅ Playbook: Health Check
## Informations
| Propriété | Valeur |
|-----------|--------|
| **ID** | `pb_56aa2f1702ef` |
| **Nom** | Playbook: Health Check |
| **Cible** | `role_sbc` |
| **Statut** | completed |
| **Type** | Manuel |
| **Progression** | 100% |
| **Début** | 2025-12-22T03:22:48.526773+00:00 |
| **Fin** | 2025-12-22T03:23:09.484672+00:00 |
| **Durée** | 21.6s |
## Sortie
```
Using /mnt/c/dev/git/python/homelab-automation-api-v2/ansible/ansible.cfg as config file
PLAY [Health check on target host] *********************************************
TASK [Check if host is reachable (ping)] ***************************************
ok: [raspi.8gb.home] => {"changed": false, "ping": "pong"}
ok: [raspi.4gb.home] => {"changed": false, "ping": "pong"}
ok: [orangepi.pc.home] => {"changed": false, "ping": "pong"}
TASK [Gather minimal facts] ****************************************************
ok: [raspi.8gb.home]
ok: [raspi.4gb.home]
ok: [orangepi.pc.home]
TASK [Get system uptime] *******************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.008335", "end": "2025-12-21 22:23:01.161234", "msg": "", "rc": 0, "start": "2025-12-21 22:23:01.152899", "stderr": "", "stderr_lines": [], "stdout": " 22:23:01 up 198 days, 13:56, 1 user, load average: 0.17, 0.19, 0.14", "stdout_lines": [" 22:23:01 up 198 days, 13:56, 1 user, load average: 0.17, 0.19, 0.14"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.009265", "end": "2025-12-21 22:23:01.206222", "msg": "", "rc": 0, "start": "2025-12-21 22:23:01.196957", "stderr": "", "stderr_lines": [], "stdout": " 22:23:01 up 198 days, 13:55, 1 user, load average: 0.23, 0.22, 0.22", "stdout_lines": [" 22:23:01 up 198 days, 13:55, 1 user, load average: 0.23, 0.22, 0.22"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.019386", "end": "2025-12-21 22:23:01.861536", "msg": "", "rc": 0, "start": "2025-12-21 22:23:01.842150", "stderr": "", "stderr_lines": [], "stdout": " 22:23:01 up 19 days, 11:49, 1 user, load average: 0.33, 0.18, 0.15", "stdout_lines": [" 22:23:01 up 19 days, 11:49, 1 user, load average: 0.33, 0.18, 0.15"]}
TASK [Get disk usage] **********************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.010654", "end": "2025-12-21 22:23:02.880120", "msg": "", "rc": 0, "start": "2025-12-21 22:23:02.869466", "stderr": "", "stderr_lines": [], "stdout": "3%", "stdout_lines": ["3%"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.011445", "end": "2025-12-21 22:23:02.893955", "msg": "", "rc": 0, "start": "2025-12-21 22:23:02.882510", "stderr": "", "stderr_lines": [], "stdout": "6%", "stdout_lines": ["6%"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.025622", "end": "2025-12-21 22:23:03.531944", "msg": "", "rc": 0, "start": "2025-12-21 22:23:03.506322", "stderr": "", "stderr_lines": [], "stdout": "21%", "stdout_lines": ["21%"]}
TASK [Get memory usage (Linux)] ************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.010846", "end": "2025-12-21 22:23:04.571534", "msg": "", "rc": 0, "start": "2025-12-21 22:23:04.560688", "stderr": "", "stderr_lines": [], "stdout": "6.8%", "stdout_lines": ["6.8%"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.011902", "end": "2025-12-21 22:23:04.615751", "msg": "", "rc": 0, "start": "2025-12-21 22:23:04.603849", "stderr": "", "stderr_lines": [], "stdout": "12.9%", "stdout_lines": ["12.9%"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.025546", "end": "2025-12-21 22:23:05.146668", "msg": "", "rc": 0, "start": "2025-12-21 22:23:05.121122", "stderr": "", "stderr_lines": [], "stdout": "21.3%", "stdout_lines": ["21.3%"]}
TASK [Get CPU temperature (ARM/SBC)] *******************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.012031", "end": "2025-12-21 22:23:06.111557", "msg": "", "rc": 0, "start": "2025-12-21 22:23:06.099526", "stderr": "", "stderr_lines": [], "stdout": "31.2°C", "stdout_lines": ["31.2°C"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.012934", "end": "2025-12-21 22:23:06.136283", "msg": "", "rc": 0, "start": "2025-12-21 22:23:06.123349", "stderr": "", "stderr_lines": [], "stdout": "36.0°C", "stdout_lines": ["36.0°C"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.028299", "end": "2025-12-21 22:23:06.778035", "msg": "", "rc": 0, "start": "2025-12-21 22:23:06.749736", "stderr": "", "stderr_lines": [], "stdout": "34.7°C", "stdout_lines": ["34.7°C"]}
TASK [Get CPU load] ************************************************************
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.011173", "end": "2025-12-21 22:23:07.826571", "msg": "", "rc": 0, "start": "2025-12-21 22:23:07.815398", "stderr": "", "stderr_lines": [], "stdout": "0.29", "stdout_lines": ["0.29"]}
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.009990", "end": "2025-12-21 22:23:07.825103", "msg": "", "rc": 0, "start": "2025-12-21 22:23:07.815113", "stderr": "", "stderr_lines": [], "stdout": "0.16", "stdout_lines": ["0.16"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.024916", "end": "2025-12-21 22:23:08.474920", "msg": "", "rc": 0, "start": "2025-12-21 22:23:08.450004", "stderr": "", "stderr_lines": [], "stdout": "0.38", "stdout_lines": ["0.38"]}
TASK [Display health status] ***************************************************
ok: [orangepi.pc.home] => {
"msg": "═══════════════════════════════════════\nHost: orangepi.pc.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 22:23:01 up 19 days, 11:49, 1 user, load average: 0.33, 0.18, 0.15\nDisk Usage: 21%\nMemory Usage: 21.3%\nCPU Load: 0.38\nCPU Temp: 34.7°C\n═══════════════════════════════════════\n"
}
ok: [raspi.4gb.home] => {
"msg": "═══════════════════════════════════════\nHost: raspi.4gb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 22:23:01 up 198 days, 13:55, 1 user, load average: 0.23, 0.22, 0.22\nDisk Usage: 6%\nMemory Usage: 12.9%\nCPU Load: 0.29\nCPU Temp: 36.0°C\n═══════════════════════════════════════\n"
}
ok: [raspi.8gb.home] => {
"msg": "═══════════════════════════════════════\nHost: raspi.8gb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 22:23:01 up 198 days, 13:56, 1 user, load average: 0.17, 0.19, 0.14\nDisk Usage: 3%\nMemory Usage: 6.8%\nCPU Load: 0.16\nCPU Temp: 31.2°C\n═══════════════════════════════════════\n"
}
PLAY RECAP *********************************************************************
orangepi.pc.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi.4gb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi.8gb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
```
---
*Généré automatiquement par Homelab Automation Dashboard*
*Date: 2025-12-22T03:23:09.508193+00:00*
@@ -0,0 +1,80 @@
# ✅ Playbook: Health Check
## Informations
| Propriété | Valeur |
|-----------|--------|
| **ID** | `pb_63960fea2661` |
| **Nom** | Playbook: Health Check |
| **Cible** | `role_sbc` |
| **Statut** | completed |
| **Type** | Manuel |
| **Progression** | 100% |
| **Début** | 2025-12-22T15:26:37.036654+00:00 |
| **Fin** | 2025-12-22T15:27:00.563786+00:00 |
| **Durée** | 24.5s |
## Sortie
```
Using /mnt/c/dev/git/python/homelab-automation-api-v2/ansible/ansible.cfg as config file
PLAY [Health check on target host] *********************************************
TASK [Check if host is reachable (ping)] ***************************************
ok: [raspi.8gb.home] => {"changed": false, "ping": "pong"}
ok: [raspi.4gb.home] => {"changed": false, "ping": "pong"}
ok: [orangepi.pc.home] => {"changed": false, "ping": "pong"}
TASK [Gather minimal facts] ****************************************************
ok: [raspi.8gb.home]
ok: [raspi.4gb.home]
ok: [orangepi.pc.home]
TASK [Get system uptime] *******************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.008279", "end": "2025-12-22 10:26:50.756667", "msg": "", "rc": 0, "start": "2025-12-22 10:26:50.748388", "stderr": "", "stderr_lines": [], "stdout": " 10:26:50 up 199 days, 1:59, 1 user, load average: 0.03, 0.07, 0.08", "stdout_lines": [" 10:26:50 up 199 days, 1:59, 1 user, load average: 0.03, 0.07, 0.08"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.009115", "end": "2025-12-22 10:26:50.810590", "msg": "", "rc": 0, "start": "2025-12-22 10:26:50.801475", "stderr": "", "stderr_lines": [], "stdout": " 10:26:50 up 199 days, 1:59, 1 user, load average: 0.20, 0.22, 0.19", "stdout_lines": [" 10:26:50 up 199 days, 1:59, 1 user, load average: 0.20, 0.22, 0.19"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.019959", "end": "2025-12-22 10:26:51.484561", "msg": "", "rc": 0, "start": "2025-12-22 10:26:51.464602", "stderr": "", "stderr_lines": [], "stdout": " 10:26:51 up 19 days, 23:53, 1 user, load average: 0.16, 0.09, 0.03", "stdout_lines": [" 10:26:51 up 19 days, 23:53, 1 user, load average: 0.16, 0.09, 0.03"]}
TASK [Get disk usage] **********************************************************
ok: [raspi.4gb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.011372", "end": "2025-12-22 10:26:52.656174", "msg": "", "rc": 0, "start": "2025-12-22 10:26:52.644802", "stderr": "", "stderr_lines": [], "stdout": "6%", "stdout_lines": ["6%"]}
ok: [raspi.8gb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.010592", "end": "2025-12-22 10:26:52.660537", "msg": "", "rc": 0, "start": "2025-12-22 10:26:52.649945", "stderr": "", "stderr_lines": [], "stdout": "3%", "stdout_lines": ["3%"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.025473", "end": "2025-12-22 10:26:53.236551", "msg": "", "rc": 0, "start": "2025-12-22 10:26:53.211078", "stderr": "", "stderr_lines": [], "stdout": "21%", "stdout_lines": ["21%"]}
TASK [Get memory usage (Linux)] ************************************************
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.011943", "end": "2025-12-22 10:26:54.363957", "msg": "", "rc": 0, "start": "2025-12-22 10:26:54.352014", "stderr": "", "stderr_lines": [], "stdout": "13.0%", "stdout_lines": ["13.0%"]}
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.011536", "end": "2025-12-22 10:26:54.380178", "msg": "", "rc": 0, "start": "2025-12-22 10:26:54.368642", "stderr": "", "stderr_lines": [], "stdout": "6.8%", "stdout_lines": ["6.8%"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.025869", "end": "2025-12-22 10:26:55.060191", "msg": "", "rc": 0, "start": "2025-12-22 10:26:55.034322", "stderr": "", "stderr_lines": [], "stdout": "19.3%", "stdout_lines": ["19.3%"]}
TASK [Get CPU temperature (ARM/SBC)] *******************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.011952", "end": "2025-12-22 10:26:56.056283", "msg": "", "rc": 0, "start": "2025-12-22 10:26:56.044331", "stderr": "", "stderr_lines": [], "stdout": "31.6°C", "stdout_lines": ["31.6°C"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.012804", "end": "2025-12-22 10:26:56.092442", "msg": "", "rc": 0, "start": "2025-12-22 10:26:56.079638", "stderr": "", "stderr_lines": [], "stdout": "36.0°C", "stdout_lines": ["36.0°C"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.028841", "end": "2025-12-22 10:26:56.739179", "msg": "", "rc": 0, "start": "2025-12-22 10:26:56.710338", "stderr": "", "stderr_lines": [], "stdout": "34.9°C", "stdout_lines": ["34.9°C"]}
TASK [Get CPU load] ************************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.010256", "end": "2025-12-22 10:26:58.000512", "msg": "", "rc": 0, "start": "2025-12-22 10:26:57.990256", "stderr": "", "stderr_lines": [], "stdout": "0.02", "stdout_lines": ["0.02"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.011106", "end": "2025-12-22 10:26:58.003816", "msg": "", "rc": 0, "start": "2025-12-22 10:26:57.992710", "stderr": "", "stderr_lines": [], "stdout": "0.26", "stdout_lines": ["0.26"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.025269", "end": "2025-12-22 10:26:58.537020", "msg": "", "rc": 0, "start": "2025-12-22 10:26:58.511751", "stderr": "", "stderr_lines": [], "stdout": "0.23", "stdout_lines": ["0.23"]}
TASK [Display health status] ***************************************************
ok: [orangepi.pc.home] => {
"msg": "═══════════════════════════════════════\nHost: orangepi.pc.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 10:26:51 up 19 days, 23:53, 1 user, load average: 0.16, 0.09, 0.03\nDisk Usage: 21%\nMemory Usage: 19.3%\nCPU Load: 0.23\nCPU Temp: 34.9°C\n═══════════════════════════════════════\n"
}
ok: [raspi.4gb.home] => {
"msg": "═══════════════════════════════════════\nHost: raspi.4gb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 10:26:50 up 199 days, 1:59, 1 user, load average: 0.20, 0.22, 0.19\nDisk Usage: 6%\nMemory Usage: 13.0%\nCPU Load: 0.26\nCPU Temp: 36.0°C\n═══════════════════════════════════════\n"
}
ok: [raspi.8gb.home] => {
"msg": "═══════════════════════════════════════\nHost: raspi.8gb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 10:26:50 up 199 days, 1:59, 1 user, load average: 0.03, 0.07, 0.08\nDisk Usage: 3%\nMemory Usage: 6.8%\nCPU Load: 0.02\nCPU Temp: 31.6°C\n═══════════════════════════════════════\n"
}
PLAY RECAP *********************************************************************
orangepi.pc.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi.4gb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi.8gb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
```
---
*Généré automatiquement par Homelab Automation Dashboard*
*Date: 2025-12-22T15:27:00.582682+00:00*
@@ -0,0 +1,80 @@
# ✅ Playbook: Health Check
## Informations
| Propriété | Valeur |
|-----------|--------|
| **ID** | `pb_12d48ce532b9` |
| **Nom** | Playbook: Health Check |
| **Cible** | `role_sbc` |
| **Statut** | completed |
| **Type** | Manuel |
| **Progression** | 100% |
| **Début** | 2025-12-22T15:39:19.302097+00:00 |
| **Fin** | 2025-12-22T15:39:37.816483+00:00 |
| **Durée** | 20.2s |
## Sortie
```
Using /mnt/c/dev/git/python/homelab-automation-api-v2/ansible/ansible.cfg as config file
PLAY [Health check on target host] *********************************************
TASK [Check if host is reachable (ping)] ***************************************
ok: [raspi.4gb.home] => {"changed": false, "ping": "pong"}
ok: [raspi.8gb.home] => {"changed": false, "ping": "pong"}
ok: [orangepi.pc.home] => {"changed": false, "ping": "pong"}
TASK [Gather minimal facts] ****************************************************
ok: [raspi.8gb.home]
ok: [raspi.4gb.home]
ok: [orangepi.pc.home]
TASK [Get system uptime] *******************************************************
ok: [raspi.4gb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.009323", "end": "2025-12-22 10:39:29.431125", "msg": "", "rc": 0, "start": "2025-12-22 10:39:29.421802", "stderr": "", "stderr_lines": [], "stdout": " 10:39:29 up 199 days, 2:12, 1 user, load average: 0.24, 0.23, 0.23", "stdout_lines": [" 10:39:29 up 199 days, 2:12, 1 user, load average: 0.24, 0.23, 0.23"]}
ok: [raspi.8gb.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.008434", "end": "2025-12-22 10:39:29.468651", "msg": "", "rc": 0, "start": "2025-12-22 10:39:29.460217", "stderr": "", "stderr_lines": [], "stdout": " 10:39:29 up 199 days, 2:12, 1 user, load average: 0.38, 0.16, 0.11", "stdout_lines": [" 10:39:29 up 199 days, 2:12, 1 user, load average: 0.38, 0.16, 0.11"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": ["uptime"], "delta": "0:00:00.019670", "end": "2025-12-22 10:39:30.099522", "msg": "", "rc": 0, "start": "2025-12-22 10:39:30.079852", "stderr": "", "stderr_lines": [], "stdout": " 10:39:30 up 20 days, 6 min, 1 user, load average: 0.22, 0.09, 0.05", "stdout_lines": [" 10:39:30 up 20 days, 6 min, 1 user, load average: 0.22, 0.09, 0.05"]}
TASK [Get disk usage] **********************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.010719", "end": "2025-12-22 10:39:30.963692", "msg": "", "rc": 0, "start": "2025-12-22 10:39:30.952973", "stderr": "", "stderr_lines": [], "stdout": "3%", "stdout_lines": ["3%"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.011443", "end": "2025-12-22 10:39:31.007648", "msg": "", "rc": 0, "start": "2025-12-22 10:39:30.996205", "stderr": "", "stderr_lines": [], "stdout": "6%", "stdout_lines": ["6%"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "df -h / | tail -1 | awk '{print $5}'", "delta": "0:00:00.025340", "end": "2025-12-22 10:39:31.678391", "msg": "", "rc": 0, "start": "2025-12-22 10:39:31.653051", "stderr": "", "stderr_lines": [], "stdout": "21%", "stdout_lines": ["21%"]}
TASK [Get memory usage (Linux)] ************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.010884", "end": "2025-12-22 10:39:32.611655", "msg": "", "rc": 0, "start": "2025-12-22 10:39:32.600771", "stderr": "", "stderr_lines": [], "stdout": "6.7%", "stdout_lines": ["6.7%"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.011883", "end": "2025-12-22 10:39:32.721361", "msg": "", "rc": 0, "start": "2025-12-22 10:39:32.709478", "stderr": "", "stderr_lines": [], "stdout": "12.9%", "stdout_lines": ["12.9%"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if command -v free >/dev/null 2>&1; then\n free -m | grep Mem | awk '{printf \"%.1f%%\", $3/$2 * 100}'\nelse\n # Fallback for systems without free command\n cat /proc/meminfo | awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf \"%.1f%%\", (total-avail)/total*100}'\nfi\n", "delta": "0:00:00.026169", "end": "2025-12-22 10:39:33.300903", "msg": "", "rc": 0, "start": "2025-12-22 10:39:33.274734", "stderr": "", "stderr_lines": [], "stdout": "19.6%", "stdout_lines": ["19.6%"]}
TASK [Get CPU temperature (ARM/SBC)] *******************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.018230", "end": "2025-12-22 10:39:34.194334", "msg": "", "rc": 0, "start": "2025-12-22 10:39:34.176104", "stderr": "", "stderr_lines": [], "stdout": "32.6°C", "stdout_lines": ["32.6°C"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.012969", "end": "2025-12-22 10:39:34.217941", "msg": "", "rc": 0, "start": "2025-12-22 10:39:34.204972", "stderr": "", "stderr_lines": [], "stdout": "36.0°C", "stdout_lines": ["36.0°C"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if [ -f /sys/class/thermal/thermal_zone0/temp ]; then\n temp=$(cat /sys/class/thermal/thermal_zone0/temp)\n # Use awk instead of bc for better compatibility\n echo \"${temp}\" | awk '{printf \"%.1f°C\", $1/1000}'\nelse\n echo \"N/A\"\nfi\n", "delta": "0:00:00.028826", "end": "2025-12-22 10:39:34.889991", "msg": "", "rc": 0, "start": "2025-12-22 10:39:34.861165", "stderr": "", "stderr_lines": [], "stdout": "35.7°C", "stdout_lines": ["35.7°C"]}
TASK [Get CPU load] ************************************************************
ok: [raspi.8gb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.010013", "end": "2025-12-22 10:39:35.806369", "msg": "", "rc": 0, "start": "2025-12-22 10:39:35.796356", "stderr": "", "stderr_lines": [], "stdout": "0.32", "stdout_lines": ["0.32"]}
ok: [raspi.4gb.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.010938", "end": "2025-12-22 10:39:35.852912", "msg": "", "rc": 0, "start": "2025-12-22 10:39:35.841974", "stderr": "", "stderr_lines": [], "stdout": "0.20", "stdout_lines": ["0.20"]}
ok: [orangepi.pc.home] => {"changed": false, "cmd": "if [ -f /proc/loadavg ]; then\n cat /proc/loadavg | awk '{print $1}'\nelse\n uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' '\nfi\n", "delta": "0:00:00.024336", "end": "2025-12-22 10:39:36.528145", "msg": "", "rc": 0, "start": "2025-12-22 10:39:36.503809", "stderr": "", "stderr_lines": [], "stdout": "0.29", "stdout_lines": ["0.29"]}
TASK [Display health status] ***************************************************
ok: [orangepi.pc.home] => {
"msg": "═══════════════════════════════════════\nHost: orangepi.pc.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 10:39:30 up 20 days, 6 min, 1 user, load average: 0.22, 0.09, 0.05\nDisk Usage: 21%\nMemory Usage: 19.6%\nCPU Load: 0.29\nCPU Temp: 35.7°C\n═══════════════════════════════════════\n"
}
ok: [raspi.4gb.home] => {
"msg": "═══════════════════════════════════════\nHost: raspi.4gb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 10:39:29 up 199 days, 2:12, 1 user, load average: 0.24, 0.23, 0.23\nDisk Usage: 6%\nMemory Usage: 12.9%\nCPU Load: 0.20\nCPU Temp: 36.0°C\n═══════════════════════════════════════\n"
}
ok: [raspi.8gb.home] => {
"msg": "═══════════════════════════════════════\nHost: raspi.8gb.home\nStatus: OK\n═══════════════════════════════════════\nUptime: 10:39:29 up 199 days, 2:12, 1 user, load average: 0.38, 0.16, 0.11\nDisk Usage: 3%\nMemory Usage: 6.7%\nCPU Load: 0.32\nCPU Temp: 32.6°C\n═══════════════════════════════════════\n"
}
PLAY RECAP *********************************************************************
orangepi.pc.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi.4gb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi.8gb.home : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
```
---
*Généré automatiquement par Homelab Automation Dashboard*
*Date: 2025-12-22T15:39:37.826449+00:00*