Add metrics monitoring stack with VictoriaMetrics, Grafana, and node_exporter
Implement complete monitoring infrastructure following rick-infra principles: Components: - VictoriaMetrics: Prometheus-compatible TSDB (7x less RAM usage) - Grafana: Visualization dashboard with Authentik OAuth/OIDC integration - node_exporter: System metrics collection (CPU, memory, disk, network) Architecture: - All services run as native systemd binaries (no containers) - localhost-only binding for security - Grafana uses native OAuth integration with Authentik (not forward_auth) - Full systemd security hardening enabled - Proxied via Caddy at metrics.jnss.me with HTTPS Role Features: - Unified metrics role (single role for complete stack) - Automatic role mapping via Authentik groups: - authentik Admins OR grafana-admins -> Admin access - grafana-editors -> Editor access - All others -> Viewer access - VictoriaMetrics auto-provisioned as default Grafana datasource - 12-month metrics retention by default - Comprehensive documentation included Security: - OAuth/OIDC SSO via Authentik - All metrics services bind to 127.0.0.1 only - systemd hardening (NoNewPrivileges, ProtectSystem, etc.) - Grafana accessible only via Caddy HTTPS proxy Documentation: - roles/metrics/README.md: Complete role documentation - docs/metrics-deployment-guide.md: Step-by-step deployment guide Configuration: - Updated rick-infra.yml to include metrics deployment - Grafana port set to 3001 (Gitea uses 3000) - Ready for multi-host expansion (designed for future node_exporter deployment to production hosts)
This commit is contained in:
9
roles/metrics/tasks/caddy.yml
Normal file
9
roles/metrics/tasks/caddy.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
- name: Deploy Grafana Caddy configuration
|
||||
ansible.builtin.template:
|
||||
src: grafana.caddy.j2
|
||||
dest: /etc/caddy/sites-enabled/grafana.caddy
|
||||
owner: caddy
|
||||
group: caddy
|
||||
mode: '0644'
|
||||
notify: reload caddy
|
||||
90
roles/metrics/tasks/grafana.yml
Normal file
90
roles/metrics/tasks/grafana.yml
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
- name: Create Grafana system user
|
||||
ansible.builtin.user:
|
||||
name: "{{ grafana_user }}"
|
||||
system: true
|
||||
create_home: false
|
||||
shell: /usr/sbin/nologin
|
||||
state: present
|
||||
|
||||
- name: Create Grafana directories
|
||||
ansible.builtin.file:
|
||||
path: "{{ item }}"
|
||||
state: directory
|
||||
owner: "{{ grafana_user }}"
|
||||
group: "{{ grafana_group }}"
|
||||
mode: '0755'
|
||||
loop:
|
||||
- "{{ grafana_data_dir }}"
|
||||
- "{{ grafana_logs_dir }}"
|
||||
- "{{ grafana_plugins_dir }}"
|
||||
- "{{ grafana_provisioning_dir }}"
|
||||
- "{{ grafana_provisioning_dir }}/datasources"
|
||||
- "{{ grafana_provisioning_dir }}/dashboards"
|
||||
- "{{ grafana_data_dir }}/dashboards"
|
||||
- /etc/grafana
|
||||
|
||||
- name: Download Grafana binary
|
||||
ansible.builtin.get_url:
|
||||
url: "https://dl.grafana.com/oss/release/grafana-{{ grafana_version }}.linux-amd64.tar.gz"
|
||||
dest: "/tmp/grafana-{{ grafana_version }}.tar.gz"
|
||||
mode: '0644'
|
||||
register: grafana_download
|
||||
|
||||
- name: Extract Grafana
|
||||
ansible.builtin.unarchive:
|
||||
src: "/tmp/grafana-{{ grafana_version }}.tar.gz"
|
||||
dest: /opt
|
||||
remote_src: true
|
||||
creates: "/opt/grafana-v{{ grafana_version }}"
|
||||
when: grafana_download.changed
|
||||
|
||||
- name: Create Grafana symlink
|
||||
ansible.builtin.file:
|
||||
src: "/opt/grafana-v{{ grafana_version }}"
|
||||
dest: /opt/grafana
|
||||
state: link
|
||||
|
||||
- name: Deploy Grafana configuration
|
||||
ansible.builtin.template:
|
||||
src: grafana.ini.j2
|
||||
dest: /etc/grafana/grafana.ini
|
||||
owner: "{{ grafana_user }}"
|
||||
group: "{{ grafana_group }}"
|
||||
mode: '0640'
|
||||
notify: restart grafana
|
||||
|
||||
- name: Deploy VictoriaMetrics datasource provisioning
|
||||
ansible.builtin.template:
|
||||
src: datasource-victoriametrics.yml.j2
|
||||
dest: "{{ grafana_provisioning_dir }}/datasources/victoriametrics.yml"
|
||||
owner: "{{ grafana_user }}"
|
||||
group: "{{ grafana_group }}"
|
||||
mode: '0644'
|
||||
notify: restart grafana
|
||||
when: grafana_datasource_vm_enabled
|
||||
|
||||
- name: Deploy dashboard provisioning
|
||||
ansible.builtin.template:
|
||||
src: dashboards.yml.j2
|
||||
dest: "{{ grafana_provisioning_dir }}/dashboards/default.yml"
|
||||
owner: "{{ grafana_user }}"
|
||||
group: "{{ grafana_group }}"
|
||||
mode: '0644'
|
||||
notify: restart grafana
|
||||
|
||||
- name: Deploy Grafana systemd service
|
||||
ansible.builtin.template:
|
||||
src: grafana.service.j2
|
||||
dest: /etc/systemd/system/grafana.service
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
||||
notify: restart grafana
|
||||
|
||||
- name: Enable and start Grafana service
|
||||
ansible.builtin.systemd:
|
||||
name: grafana
|
||||
enabled: "{{ grafana_service_enabled }}"
|
||||
state: "{{ grafana_service_state }}"
|
||||
daemon_reload: true
|
||||
20
roles/metrics/tasks/main.yml
Normal file
20
roles/metrics/tasks/main.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
# =================================================================
|
||||
# Metrics Stack Deployment
|
||||
# =================================================================
|
||||
|
||||
- name: Deploy VictoriaMetrics
|
||||
ansible.builtin.include_tasks: victoriametrics.yml
|
||||
tags: [metrics, victoriametrics]
|
||||
|
||||
- name: Deploy node_exporter
|
||||
ansible.builtin.include_tasks: node_exporter.yml
|
||||
tags: [metrics, node_exporter]
|
||||
|
||||
- name: Deploy Grafana
|
||||
ansible.builtin.include_tasks: grafana.yml
|
||||
tags: [metrics, grafana]
|
||||
|
||||
- name: Deploy Caddy configuration for Grafana
|
||||
ansible.builtin.include_tasks: caddy.yml
|
||||
tags: [metrics, caddy]
|
||||
49
roles/metrics/tasks/node_exporter.yml
Normal file
49
roles/metrics/tasks/node_exporter.yml
Normal file
@@ -0,0 +1,49 @@
|
||||
---
|
||||
- name: Create node_exporter system user
|
||||
ansible.builtin.user:
|
||||
name: "{{ node_exporter_user }}"
|
||||
system: true
|
||||
create_home: false
|
||||
shell: /usr/sbin/nologin
|
||||
state: present
|
||||
|
||||
- name: Download node_exporter binary
|
||||
ansible.builtin.get_url:
|
||||
url: "https://github.com/prometheus/node_exporter/releases/download/v{{ node_exporter_version }}/node_exporter-{{ node_exporter_version }}.linux-amd64.tar.gz"
|
||||
dest: "/tmp/node_exporter-{{ node_exporter_version }}.tar.gz"
|
||||
mode: '0644'
|
||||
register: node_exporter_download
|
||||
|
||||
- name: Extract node_exporter binary
|
||||
ansible.builtin.unarchive:
|
||||
src: "/tmp/node_exporter-{{ node_exporter_version }}.tar.gz"
|
||||
dest: /tmp
|
||||
remote_src: true
|
||||
creates: "/tmp/node_exporter-{{ node_exporter_version }}.linux-amd64"
|
||||
when: node_exporter_download.changed
|
||||
|
||||
- name: Copy node_exporter binary to /usr/local/bin
|
||||
ansible.builtin.copy:
|
||||
src: "/tmp/node_exporter-{{ node_exporter_version }}.linux-amd64/node_exporter"
|
||||
dest: /usr/local/bin/node_exporter
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0755'
|
||||
remote_src: true
|
||||
when: node_exporter_download.changed
|
||||
|
||||
- name: Deploy node_exporter systemd service
|
||||
ansible.builtin.template:
|
||||
src: node_exporter.service.j2
|
||||
dest: /etc/systemd/system/node_exporter.service
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
||||
notify: restart node_exporter
|
||||
|
||||
- name: Enable and start node_exporter service
|
||||
ansible.builtin.systemd:
|
||||
name: node_exporter
|
||||
enabled: "{{ node_exporter_service_enabled }}"
|
||||
state: "{{ node_exporter_service_state }}"
|
||||
daemon_reload: true
|
||||
66
roles/metrics/tasks/victoriametrics.yml
Normal file
66
roles/metrics/tasks/victoriametrics.yml
Normal file
@@ -0,0 +1,66 @@
|
||||
---
|
||||
- name: Create VictoriaMetrics system user
|
||||
ansible.builtin.user:
|
||||
name: "{{ victoriametrics_user }}"
|
||||
system: true
|
||||
create_home: false
|
||||
shell: /usr/sbin/nologin
|
||||
state: present
|
||||
|
||||
- name: Create VictoriaMetrics directories
|
||||
ansible.builtin.file:
|
||||
path: "{{ item }}"
|
||||
state: directory
|
||||
owner: "{{ victoriametrics_user }}"
|
||||
group: "{{ victoriametrics_group }}"
|
||||
mode: '0755'
|
||||
loop:
|
||||
- "{{ victoriametrics_data_dir }}"
|
||||
- "{{ victoriametrics_scrape_config_dir }}"
|
||||
|
||||
- name: Download VictoriaMetrics binary
|
||||
ansible.builtin.get_url:
|
||||
url: "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v{{ victoriametrics_version }}/victoria-metrics-linux-amd64-v{{ victoriametrics_version }}.tar.gz"
|
||||
dest: "/tmp/victoria-metrics-v{{ victoriametrics_version }}.tar.gz"
|
||||
mode: '0644'
|
||||
register: victoriametrics_download
|
||||
|
||||
- name: Extract VictoriaMetrics binary
|
||||
ansible.builtin.unarchive:
|
||||
src: "/tmp/victoria-metrics-v{{ victoriametrics_version }}.tar.gz"
|
||||
dest: /usr/local/bin
|
||||
remote_src: true
|
||||
creates: /usr/local/bin/victoria-metrics-prod
|
||||
when: victoriametrics_download.changed
|
||||
|
||||
- name: Set VictoriaMetrics binary permissions
|
||||
ansible.builtin.file:
|
||||
path: /usr/local/bin/victoria-metrics-prod
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0755'
|
||||
|
||||
- name: Deploy VictoriaMetrics scrape configuration
|
||||
ansible.builtin.template:
|
||||
src: scrape.yml.j2
|
||||
dest: "{{ victoriametrics_scrape_config_file }}"
|
||||
owner: "{{ victoriametrics_user }}"
|
||||
group: "{{ victoriametrics_group }}"
|
||||
mode: '0644'
|
||||
notify: restart victoriametrics
|
||||
|
||||
- name: Deploy VictoriaMetrics systemd service
|
||||
ansible.builtin.template:
|
||||
src: victoriametrics.service.j2
|
||||
dest: /etc/systemd/system/victoriametrics.service
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
||||
notify: restart victoriametrics
|
||||
|
||||
- name: Enable and start VictoriaMetrics service
|
||||
ansible.builtin.systemd:
|
||||
name: victoriametrics
|
||||
enabled: "{{ victoriametrics_service_enabled }}"
|
||||
state: "{{ victoriametrics_service_state }}"
|
||||
daemon_reload: true
|
||||
Reference in New Issue
Block a user