From f4b1ae92c2ec6359823aaf0941a32f19f95b4f43 Mon Sep 17 00:00:00 2001 From: darnodo Date: Sat, 21 Jun 2025 08:28:10 +0200 Subject: [PATCH 1/3] ansible : install dnsmasq_exporter --- ansible/playbooks/setup_dns_server.yml | 1 + ansible/playbooks/update_dns_records.yml | 1 + .../roles/dnsmasq_exporter/handlers/main.yml | 10 ++++ ansible/roles/dnsmasq_exporter/tasks/main.yml | 56 +++++++++++++++++++ .../templates/dnsmasq_exporter.service.j2 | 13 +++++ 5 files changed, 81 insertions(+) create mode 100644 ansible/roles/dnsmasq_exporter/handlers/main.yml create mode 100644 ansible/roles/dnsmasq_exporter/tasks/main.yml create mode 100644 ansible/roles/dnsmasq_exporter/templates/dnsmasq_exporter.service.j2 diff --git a/ansible/playbooks/setup_dns_server.yml b/ansible/playbooks/setup_dns_server.yml index 930a444..76d2c23 100644 --- a/ansible/playbooks/setup_dns_server.yml +++ b/ansible/playbooks/setup_dns_server.yml @@ -12,3 +12,4 @@ become: true roles: - role: dns_server + - role: dnsmasq_exporter diff --git a/ansible/playbooks/update_dns_records.yml b/ansible/playbooks/update_dns_records.yml index e377cb7..d31cb4f 100644 --- a/ansible/playbooks/update_dns_records.yml +++ b/ansible/playbooks/update_dns_records.yml @@ -13,3 +13,4 @@ become: true roles: - role: dns_server + - role: dnsmasq_exporter diff --git a/ansible/roles/dnsmasq_exporter/handlers/main.yml b/ansible/roles/dnsmasq_exporter/handlers/main.yml new file mode 100644 index 0000000..6f8e866 --- /dev/null +++ b/ansible/roles/dnsmasq_exporter/handlers/main.yml @@ -0,0 +1,10 @@ +--- +# ================================================================ +# Handlers for dnsmasq_exporter role +# ================================================================ + +- name: Reload systemd + ansible.builtin.systemd: + daemon_reload: true + become: true + listen: Reload systemd diff --git a/ansible/roles/dnsmasq_exporter/tasks/main.yml b/ansible/roles/dnsmasq_exporter/tasks/main.yml new file mode 100644 index 0000000..c122c12 --- /dev/null +++ b/ansible/roles/dnsmasq_exporter/tasks/main.yml @@ -0,0 +1,56 @@ +--- +# ================================================================ +# Rôle : dnsmasq_exporter +# Tâches principales +# +# Objectif : Installer la dernière version de dnsmasq_exporter +# via `go install` et la lancer comme service systemd. +# +# Remarque : cette implémentation reste volontairement simple. +# - Aucune gestion fine de la version : toujours la « latest ». +# - Repose sur le paquet Debian/Ubuntu `golang`. +# - Le binaire est installé directement dans /usr/local/bin +# grâce à la variable d’environnement GOBIN. +# ================================================================ + +- name: "[dnsmasq_exporter] Dépendances build (golang, git)" + ansible.builtin.apt: + name: + - golang-go + - git + state: present + update_cache: true + tags: + - dnsmasq_exporter + - install + +- name: "[dnsmasq_exporter] Installation du binaire (go install @latest)" + ansible.builtin.command: + cmd: go install github.com/google/dnsmasq_exporter@latest + creates: /usr/local/bin/dnsmasq_exporter + environment: + GOBIN: /usr/local/bin + tags: + - dnsmasq_exporter + - build + +- name: "[dnsmasq_exporter] Déploiement du service systemd" + ansible.builtin.template: + src: dnsmasq_exporter.service.j2 + dest: /etc/systemd/system/dnsmasq_exporter.service + owner: root + group: root + mode: "0644" + notify: Reload systemd + tags: + - dnsmasq_exporter + - config + +- name: "[dnsmasq_exporter] Activation et démarrage du service" + ansible.builtin.service: + name: dnsmasq_exporter + state: started + enabled: true + tags: + - dnsmasq_exporter + - service diff --git a/ansible/roles/dnsmasq_exporter/templates/dnsmasq_exporter.service.j2 b/ansible/roles/dnsmasq_exporter/templates/dnsmasq_exporter.service.j2 new file mode 100644 index 0000000..b2ee28e --- /dev/null +++ b/ansible/roles/dnsmasq_exporter/templates/dnsmasq_exporter.service.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=Prometheus dnsmasq_exporter +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +ExecStart=/usr/local/bin/dnsmasq_exporter +Restart=on-failure +RestartSec=5s + +[Install] +WantedBy=multi-user.target From 23440ad6bd70f6a537b48399ea35c7a5112d5c2c Mon Sep 17 00:00:00 2001 From: darnodo Date: Wed, 25 Jun 2025 15:33:44 +0200 Subject: [PATCH 2/3] ansible/dns : switch to grafana alloy --- ansible/playbooks/setup_dns_server.yml | 2 +- ansible/playbooks/update_dns_records.yml | 2 +- .../dns_server/templates/dnsmasq.conf.j2 | 3 + .../roles/dnsmasq_exporter/handlers/main.yml | 10 -- ansible/roles/dnsmasq_exporter/tasks/main.yml | 56 ------- .../templates/dnsmasq_exporter.service.j2 | 13 -- ansible/roles/grafana_alloy/handlers/main.yml | 24 +++ ansible/roles/grafana_alloy/tasks/main.yml | 139 ++++++++++++++++++ .../grafana_alloy/templates/alloy.service.j2 | 27 ++++ .../grafana_alloy/templates/config.alloy.j2 | 70 +++++++++ 10 files changed, 265 insertions(+), 81 deletions(-) delete mode 100644 ansible/roles/dnsmasq_exporter/handlers/main.yml delete mode 100644 ansible/roles/dnsmasq_exporter/tasks/main.yml delete mode 100644 ansible/roles/dnsmasq_exporter/templates/dnsmasq_exporter.service.j2 create mode 100644 ansible/roles/grafana_alloy/handlers/main.yml create mode 100644 ansible/roles/grafana_alloy/tasks/main.yml create mode 100644 ansible/roles/grafana_alloy/templates/alloy.service.j2 create mode 100644 ansible/roles/grafana_alloy/templates/config.alloy.j2 diff --git a/ansible/playbooks/setup_dns_server.yml b/ansible/playbooks/setup_dns_server.yml index 76d2c23..bb210b5 100644 --- a/ansible/playbooks/setup_dns_server.yml +++ b/ansible/playbooks/setup_dns_server.yml @@ -12,4 +12,4 @@ become: true roles: - role: dns_server - - role: dnsmasq_exporter + - role: grafana_alloy diff --git a/ansible/playbooks/update_dns_records.yml b/ansible/playbooks/update_dns_records.yml index d31cb4f..f9dd284 100644 --- a/ansible/playbooks/update_dns_records.yml +++ b/ansible/playbooks/update_dns_records.yml @@ -13,4 +13,4 @@ become: true roles: - role: dns_server - - role: dnsmasq_exporter + - role: grafana_alloy diff --git a/ansible/roles/dns_server/templates/dnsmasq.conf.j2 b/ansible/roles/dns_server/templates/dnsmasq.conf.j2 index b61944b..ffd953b 100644 --- a/ansible/roles/dns_server/templates/dnsmasq.conf.j2 +++ b/ansible/roles/dns_server/templates/dnsmasq.conf.j2 @@ -28,6 +28,9 @@ server={{ server }} # Taille du cache cache-size={{ dnsmasq_cache_size }} +# Configuration log +log-facility=/var/log/dnsmasq.log + # On indique explicitement où trouver nos listes d'hôtes additionnelles addn-hosts=/etc/dnsmasq.hosts.d/records.home.arnodo.fr addn-hosts=/etc/dnsmasq.hosts.d/records.lab.arnodo.fr diff --git a/ansible/roles/dnsmasq_exporter/handlers/main.yml b/ansible/roles/dnsmasq_exporter/handlers/main.yml deleted file mode 100644 index 6f8e866..0000000 --- a/ansible/roles/dnsmasq_exporter/handlers/main.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -# ================================================================ -# Handlers for dnsmasq_exporter role -# ================================================================ - -- name: Reload systemd - ansible.builtin.systemd: - daemon_reload: true - become: true - listen: Reload systemd diff --git a/ansible/roles/dnsmasq_exporter/tasks/main.yml b/ansible/roles/dnsmasq_exporter/tasks/main.yml deleted file mode 100644 index c122c12..0000000 --- a/ansible/roles/dnsmasq_exporter/tasks/main.yml +++ /dev/null @@ -1,56 +0,0 @@ ---- -# ================================================================ -# Rôle : dnsmasq_exporter -# Tâches principales -# -# Objectif : Installer la dernière version de dnsmasq_exporter -# via `go install` et la lancer comme service systemd. -# -# Remarque : cette implémentation reste volontairement simple. -# - Aucune gestion fine de la version : toujours la « latest ». -# - Repose sur le paquet Debian/Ubuntu `golang`. -# - Le binaire est installé directement dans /usr/local/bin -# grâce à la variable d’environnement GOBIN. -# ================================================================ - -- name: "[dnsmasq_exporter] Dépendances build (golang, git)" - ansible.builtin.apt: - name: - - golang-go - - git - state: present - update_cache: true - tags: - - dnsmasq_exporter - - install - -- name: "[dnsmasq_exporter] Installation du binaire (go install @latest)" - ansible.builtin.command: - cmd: go install github.com/google/dnsmasq_exporter@latest - creates: /usr/local/bin/dnsmasq_exporter - environment: - GOBIN: /usr/local/bin - tags: - - dnsmasq_exporter - - build - -- name: "[dnsmasq_exporter] Déploiement du service systemd" - ansible.builtin.template: - src: dnsmasq_exporter.service.j2 - dest: /etc/systemd/system/dnsmasq_exporter.service - owner: root - group: root - mode: "0644" - notify: Reload systemd - tags: - - dnsmasq_exporter - - config - -- name: "[dnsmasq_exporter] Activation et démarrage du service" - ansible.builtin.service: - name: dnsmasq_exporter - state: started - enabled: true - tags: - - dnsmasq_exporter - - service diff --git a/ansible/roles/dnsmasq_exporter/templates/dnsmasq_exporter.service.j2 b/ansible/roles/dnsmasq_exporter/templates/dnsmasq_exporter.service.j2 deleted file mode 100644 index b2ee28e..0000000 --- a/ansible/roles/dnsmasq_exporter/templates/dnsmasq_exporter.service.j2 +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Prometheus dnsmasq_exporter -After=network-online.target -Wants=network-online.target - -[Service] -Type=simple -ExecStart=/usr/local/bin/dnsmasq_exporter -Restart=on-failure -RestartSec=5s - -[Install] -WantedBy=multi-user.target diff --git a/ansible/roles/grafana_alloy/handlers/main.yml b/ansible/roles/grafana_alloy/handlers/main.yml new file mode 100644 index 0000000..83bdfe6 --- /dev/null +++ b/ansible/roles/grafana_alloy/handlers/main.yml @@ -0,0 +1,24 @@ +--- +# ================================================================ +# Handlers for grafana_alloy role +# ================================================================ + +- name: Reload systemd + ansible.builtin.systemd: + daemon_reload: true + become: true + listen: Reload systemd + +- name: Restart alloy + ansible.builtin.service: + name: alloy + state: restarted + become: true + listen: Restart alloy + +- name: Convert GPG key + ansible.builtin.command: + cmd: gpg --dearmor -o /etc/apt/keyrings/grafana.gpg /tmp/grafana.gpg.key + creates: /etc/apt/keyrings/grafana.gpg + become: true + listen: Convert GPG key diff --git a/ansible/roles/grafana_alloy/tasks/main.yml b/ansible/roles/grafana_alloy/tasks/main.yml new file mode 100644 index 0000000..0ce2785 --- /dev/null +++ b/ansible/roles/grafana_alloy/tasks/main.yml @@ -0,0 +1,139 @@ +--- +# ================================================================ +# Rôle : grafana_alloy +# Tâches principales +# +# Objectif : Installer Grafana Alloy depuis le dépôt officiel +# Grafana sur une distribution Debian/Ubuntu, puis +# déployer la configuration et le service systemd. +# +# Étapes CLI équivalentes : +# 1. sudo apt install gpg +# 2. sudo mkdir -p /etc/apt/keyrings/ +# 3. wget -q -O - https://apt.grafana.com/gpg.key | \ +# gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg >/dev/null +# 4. echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] \ +# https://apt.grafana.com stable main" \ +# | sudo tee /etc/apt/sources.list.d/grafana.list +# 5. sudo apt-get update +# 6. sudo apt-get install alloy +# 7. sudo systemctl start alloy +# 8. sudo systemctl enable alloy.service +# +# Cette implémentation reprend ces étapes en Ansible et ajoute +# les déploiements de configuration + unité systemd. +# ================================================================ + +- name: "[grafana_alloy] Paquets de base (gpg, wget, apt-transport-https, ca-certificates)" + ansible.builtin.apt: + name: + - gpg + - wget + - apt-transport-https + - ca-certificates + state: present + update_cache: true + tags: + - grafana_alloy + - install + +- name: "[grafana_alloy] Création du répertoire /etc/apt/keyrings" + ansible.builtin.file: + path: /etc/apt/keyrings + state: directory + mode: "0755" + tags: + - grafana_alloy + - repo + +- name: "[grafana_alloy] Téléchargement de la clé GPG Grafana" + ansible.builtin.get_url: + url: https://apt.grafana.com/gpg.key + dest: /tmp/grafana.gpg.key + mode: "0644" + notify: Convert GPG key + tags: + - grafana_alloy + - repo + +- name: "[grafana_alloy] Conversion de la clé GPG au format keyring" + ansible.builtin.command: + cmd: gpg --dearmor -o /etc/apt/keyrings/grafana.gpg /tmp/grafana.gpg.key + creates: /etc/apt/keyrings/grafana.gpg + tags: + - grafana_alloy + - repo + +- name: "[grafana_alloy] Ajout du dépôt Grafana" + ansible.builtin.apt_repository: + repo: "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" + filename: grafana + state: present + tags: + - grafana_alloy + - repo + +- name: "[grafana_alloy] Installation du paquet alloy" + ansible.builtin.apt: + name: alloy + state: present + update_cache: true + tags: + - grafana_alloy + - install + +# ---------------------------------------------------------------- +# Déploiement de la configuration d'Alloy (River) +# ---------------------------------------------------------------- +- name: "[grafana_alloy] Dossier de configuration /etc/alloy" + ansible.builtin.file: + path: /etc/alloy + state: directory + owner: root + group: root + mode: "0755" + tags: + - grafana_alloy + - config + +- name: "[grafana_alloy] Déploiement de la configuration Alloy" + ansible.builtin.template: + src: config.alloy.j2 + dest: "{{ alloy_config_file | default('/etc/alloy/config.alloy') }}" + owner: root + group: root + mode: "0644" + notify: + - Restart alloy + tags: + - grafana_alloy + - config + +# ---------------------------------------------------------------- +# Déploiement/override de l’unité systemd +# ---------------------------------------------------------------- +- name: "[grafana_alloy] Déploiement du service systemd (override)" + ansible.builtin.template: + src: alloy.service.j2 + dest: /etc/systemd/system/alloy.service + owner: root + group: root + mode: "0644" + notify: + - Reload systemd + - Restart alloy + tags: + - grafana_alloy + - config + +# ---------------------------------------------------------------- +# Activation et démarrage du service +# ---------------------------------------------------------------- +- name: "[grafana_alloy] Démarrage et activation du service alloy" + ansible.builtin.service: + name: alloy + state: started + enabled: true + tags: + - grafana_alloy + - service diff --git a/ansible/roles/grafana_alloy/templates/alloy.service.j2 b/ansible/roles/grafana_alloy/templates/alloy.service.j2 new file mode 100644 index 0000000..cab8ad5 --- /dev/null +++ b/ansible/roles/grafana_alloy/templates/alloy.service.j2 @@ -0,0 +1,27 @@ +[Unit] +Description=Grafana Alloy +Documentation=https://grafana.com/docs/alloy/latest/ +Wants=network-online.target +After=network-online.target + +[Service] +User=alloy +Group=alloy +Type=simple + +# Commande de démarrage finale et correcte, basée sur la sortie de "alloy run --help" +ExecStart=/usr/bin/alloy run /etc/alloy/config.alloy \ + --storage.path=/var/lib/alloy \ + --server.http.listen-addr=127.0.0.1:12345 + +# Sécurité via systemd +ReadWritePaths=/var/lib/alloy +ReadOnlyPaths=/etc/alloy + +# Politiques de redémarrage et de limites de fichiers +Restart=on-failure +RestartSec=5s +LimitNOFILE=65536 + +[Install] +WantedBy=multi-user.target diff --git a/ansible/roles/grafana_alloy/templates/config.alloy.j2 b/ansible/roles/grafana_alloy/templates/config.alloy.j2 new file mode 100644 index 0000000..3a39016 --- /dev/null +++ b/ansible/roles/grafana_alloy/templates/config.alloy.j2 @@ -0,0 +1,70 @@ +// ============================================================================= +// Template Grafana Alloy final pour le monitoring complet du Raspberry Pi +// Envoie les métriques à Prometheus et les logs à Loki. +// ============================================================================= + +logging { + level = "{{ alloy_log_level | default("info") }}" + format = "{{ alloy_log_format | default("logfmt") }}" +} + +// ----------------------------------------------------------------------------- +// Section 1 : Définition des destinations sur le serveur de monitoring +// ----------------------------------------------------------------------------- + +// Destination pour les métriques +prometheus.remote_write "to_prometheus" { + endpoint { + // URL de votre serveur Prometheus + url = "{{ alloy_prometheus_url | default("http://vision.lab.home.arnodo.fr:9090/api/v1/write") }}" + } +} + +// Destination pour les logs +loki.write "to_loki" { + endpoint { + // URL de votre serveur Loki + url = "{{ alloy_loki_url | default("http://vision.lab.home.arnodo.fr:3100/loki/api/v1/push") }}" + } + // On ajoute un label à tous les logs pour savoir d'où ils viennent + external_labels = { + source = "raspberrypi", + } +} + +// ----------------------------------------------------------------------------- +// Section 2 : Collecte des données sur le Raspberry Pi +// ----------------------------------------------------------------------------- + +// --- Collecte des métriques --- + +// Active le module interne pour les métriques système (CPU, RAM, etc.) +prometheus.exporter.unix "system" {} + +// Active le module interne pour vérifier le statut de Dnsmasq +prometheus.exporter.dnsmasq "dnsmasq_status" {} + +// Scrape les métriques des deux modules ci-dessus et les envoie à Prometheus +prometheus.scrape "local_metrics" { + targets = concat( + prometheus.exporter.unix.system.targets, + prometheus.exporter.dnsmasq.dnsmasq_status.targets, + ) + forward_to = [prometheus.remote_write.to_prometheus.receiver] +} + + +// --- Collecte des logs --- + +// Lit les logs du journal systemd (la méthode la plus propre et complète) +loki.source.journal "system_logs" { + // Ajoute un label "job" aux logs pour les identifier dans Grafana + relabel_rules { + rule { + target_label = "job" + action = "replace" + replacement = "journal" + } + } + forward_to = [loki.write.to_loki.receiver] +} From 3df6855bb091a7ddf854871928039cd4e97257c7 Mon Sep 17 00:00:00 2001 From: darnodo Date: Wed, 25 Jun 2025 19:32:38 +0200 Subject: [PATCH 3/3] ansible(dns): adding alloy configuration --- .../grafana_alloy/templates/config.alloy.j2 | 44 +++++-------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/ansible/roles/grafana_alloy/templates/config.alloy.j2 b/ansible/roles/grafana_alloy/templates/config.alloy.j2 index 3a39016..864296b 100644 --- a/ansible/roles/grafana_alloy/templates/config.alloy.j2 +++ b/ansible/roles/grafana_alloy/templates/config.alloy.j2 @@ -1,6 +1,6 @@ // ============================================================================= -// Template Grafana Alloy final pour le monitoring complet du Raspberry Pi -// Envoie les métriques à Prometheus et les logs à Loki. +// Template Grafana Alloy pour Ansible +// Monitoring complet : Métriques Système + Statut Dnsmasq + Logs Système // ============================================================================= logging { @@ -8,43 +8,26 @@ logging { format = "{{ alloy_log_format | default("logfmt") }}" } -// ----------------------------------------------------------------------------- -// Section 1 : Définition des destinations sur le serveur de monitoring -// ----------------------------------------------------------------------------- - -// Destination pour les métriques +// --- Destinations --- prometheus.remote_write "to_prometheus" { endpoint { - // URL de votre serveur Prometheus url = "{{ alloy_prometheus_url | default("http://vision.lab.home.arnodo.fr:9090/api/v1/write") }}" } } -// Destination pour les logs loki.write "to_loki" { endpoint { - // URL de votre serveur Loki url = "{{ alloy_loki_url | default("http://vision.lab.home.arnodo.fr:3100/loki/api/v1/push") }}" } - // On ajoute un label à tous les logs pour savoir d'où ils viennent external_labels = { source = "raspberrypi", } } -// ----------------------------------------------------------------------------- -// Section 2 : Collecte des données sur le Raspberry Pi -// ----------------------------------------------------------------------------- - -// --- Collecte des métriques --- - -// Active le module interne pour les métriques système (CPU, RAM, etc.) +// --- Pipeline des métriques --- prometheus.exporter.unix "system" {} - -// Active le module interne pour vérifier le statut de Dnsmasq prometheus.exporter.dnsmasq "dnsmasq_status" {} -// Scrape les métriques des deux modules ci-dessus et les envoie à Prometheus prometheus.scrape "local_metrics" { targets = concat( prometheus.exporter.unix.system.targets, @@ -53,18 +36,15 @@ prometheus.scrape "local_metrics" { forward_to = [prometheus.remote_write.to_prometheus.receiver] } - -// --- Collecte des logs --- - -// Lit les logs du journal systemd (la méthode la plus propre et complète) +// --- Pipeline des logs --- loki.source.journal "system_logs" { - // Ajoute un label "job" aux logs pour les identifier dans Grafana - relabel_rules { - rule { - target_label = "job" - action = "replace" - replacement = "journal" - } + forward_to = [loki.relabel.add_job_label.receiver] +} + +loki.relabel "add_job_label" { + rule { + target_label = "job" + replacement = "journal" } forward_to = [loki.write.to_loki.receiver] }