summaryrefslogtreecommitdiff
path: root/roles/monitoring/prometheus/exporter/base
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2021-07-25 11:24:47 +0200
committerChristian Pointner <equinox@spreadspace.org>2021-07-25 11:24:47 +0200
commit83a9137a8450f5e8ec1ae828b3e3e3554b76b013 (patch)
tree701077b59e758fd9145f068e9f66dcf088ee62fd /roles/monitoring/prometheus/exporter/base
parentele-router: preapare setup for e21 (diff)
parentpromethues exporter: add TODO list (diff)
Merge branch 'topic/prometheus'
Diffstat (limited to 'roles/monitoring/prometheus/exporter/base')
-rw-r--r--roles/monitoring/prometheus/exporter/base/defaults/main.yml2
-rw-r--r--roles/monitoring/prometheus/exporter/base/handlers/main.yml5
-rw-r--r--roles/monitoring/prometheus/exporter/base/tasks/main.yml48
-rw-r--r--roles/monitoring/prometheus/exporter/base/tasks/tls.yml100
-rw-r--r--roles/monitoring/prometheus/exporter/base/templates/nginx-vhost.conf.j215
-rw-r--r--roles/monitoring/prometheus/exporter/base/templates/service.j232
6 files changed, 174 insertions, 28 deletions
diff --git a/roles/monitoring/prometheus/exporter/base/defaults/main.yml b/roles/monitoring/prometheus/exporter/base/defaults/main.yml
index 5f8ce103..963763a5 100644
--- a/roles/monitoring/prometheus/exporter/base/defaults/main.yml
+++ b/roles/monitoring/prometheus/exporter/base/defaults/main.yml
@@ -1,2 +1,2 @@
---
-prometheus_exporter_port: 9000
+prometheus_exporter_listen: ":9999"
diff --git a/roles/monitoring/prometheus/exporter/base/handlers/main.yml b/roles/monitoring/prometheus/exporter/base/handlers/main.yml
new file mode 100644
index 00000000..ebd760cf
--- /dev/null
+++ b/roles/monitoring/prometheus/exporter/base/handlers/main.yml
@@ -0,0 +1,5 @@
+---
+- name: restart prometheus-exporter-exporter
+ service:
+ name: prometheus-exporter-exporter
+ state: restarted
diff --git a/roles/monitoring/prometheus/exporter/base/tasks/main.yml b/roles/monitoring/prometheus/exporter/base/tasks/main.yml
index c3a04bd9..9a214f39 100644
--- a/roles/monitoring/prometheus/exporter/base/tasks/main.yml
+++ b/roles/monitoring/prometheus/exporter/base/tasks/main.yml
@@ -1,16 +1,40 @@
---
-- name: create main configuration directories
- loop:
- - exporters-available
- - exporters-enabled
+- name: check if prometheus apt component of spreadspace repo is enabled
+ assert:
+ msg: "please enable the 'prometheus' component of spreadspace repo using 'spreadspace_apt_repo_components'"
+ that:
+ - spreadspace_apt_repo_components is defined
+ - "'prometheus' in spreadspace_apt_repo_components"
+
+- name: install apt packages
+ apt:
+ name: prom-exporter-exporter
+ state: present
+
+- name: create configuration directories
file:
- path: "/etc/prometheus-exporter/{{ item }}"
+ path: /etc/prometheus/exporter/enabled
state: directory
-- name: install nginx vhost
- vars:
- nginx_vhost:
- name: prometheus-exporter
- content: "{{ lookup('template', 'nginx-vhost.conf.j2') }}"
- include_role:
- name: nginx/vhost
+- name: add user for prometheus-exporter
+ user:
+ name: prometheus-exporter
+ system: yes
+ home: /nonexistent
+ create_home: no
+
+- name: create TLS certificate and key
+ import_tasks: tls.yml
+
+- name: generate systemd service unit
+ template:
+ src: service.j2
+ dest: /etc/systemd/system/prometheus-exporter-exporter.service
+ notify: restart prometheus-exporter-exporter
+
+- name: make sure prometheus-exporter-exporter is enabled and started
+ systemd:
+ name: prometheus-exporter-exporter.service
+ daemon_reload: yes
+ state: started
+ enabled: yes
diff --git a/roles/monitoring/prometheus/exporter/base/tasks/tls.yml b/roles/monitoring/prometheus/exporter/base/tasks/tls.yml
new file mode 100644
index 00000000..e34025e4
--- /dev/null
+++ b/roles/monitoring/prometheus/exporter/base/tasks/tls.yml
@@ -0,0 +1,100 @@
+---
+- name: install python-cryptoraphy
+ apt:
+ name: "{{ python_basename }}-cryptography"
+ state: present
+
+- name: create base directory
+ file:
+ path: /etc/ssl/prometheus
+ state: directory
+
+- name: create exporter cert/key directory
+ file:
+ path: /etc/ssl/prometheus/exporter
+ state: directory
+ owner: root
+ group: prometheus-exporter
+ mode: 0750
+
+- name: create exporter private key
+ openssl_privatekey:
+ path: /etc/ssl/prometheus/exporter/key.pem
+ type: RSA
+ size: 4096
+ owner: prometheus-exporter
+ group: prometheus-exporter
+ mode: 0400
+ notify: restart prometheus-exporter-exporter
+
+- name: create signing request for exporter certificate
+ openssl_csr:
+ path: /etc/ssl/prometheus/exporter/csr.pem
+ privatekey_path: /etc/ssl/prometheus/exporter/key.pem
+ CN: "{{ inventory_hostname }}"
+ subject_alt_name:
+ - "DNS:{{ host_name }}.{{ host_domain }}"
+ - "IP:{{ ansible_default_ipv4.address }}"
+ key_usage:
+ - digitalSignature
+ key_usage_critical: yes
+ extended_key_usage:
+ - serverAuth
+ extended_key_usage_critical: yes
+ basic_constraints:
+ - 'CA:FALSE'
+ basic_constraints_critical: yes
+
+- name: slurp CSR
+ slurp:
+ src: /etc/ssl/prometheus/exporter/csr.pem
+ register: prometheus_exporter_server_csr
+
+- name: check if exporter certificate exists
+ stat:
+ path: /etc/ssl/prometheus/exporter/crt.pem
+ register: prometheus_exporter_server_cert
+
+- name: read exporter client certificate validity
+ when: prometheus_exporter_server_cert.stat.exists
+ openssl_certificate_info:
+ path: /etc/ssl/prometheus/exporter/crt.pem
+ valid_at:
+ ten_years: '+3650d'
+ register: prometheus_exporter_server_cert_info
+
+- name: slurp existing exporter certificate
+ when: prometheus_exporter_server_cert.stat.exists
+ slurp:
+ src: /etc/ssl/prometheus/exporter/crt.pem
+ register: prometheus_exporter_server_cert_current
+
+- name: generate exporter certificate
+ delegate_to: "{{ prometheus_server }}"
+ community.crypto.x509_certificate_pipe:
+ content: "{{ prometheus_exporter_server_cert_current.content | default('') | b64decode }}"
+ csr_content: "{{ prometheus_exporter_server_csr.content | b64decode }}"
+ provider: ownca
+ ownca_path: /etc/ssl/prometheus/ca-crt.pem
+ ownca_privatekey_path: /etc/ssl/prometheus/ca/key.pem
+ ownca_digest: sha256
+ ownca_not_after: "+18250d" ## 50 years
+ force: "{{ prometheus_exporter_server_cert.stat.exists and (not prometheus_exporter_server_cert_info.valid_at.ten_years) }}"
+ register: prometheus_exporter_server_cert
+
+- name: store exporter certificate
+ copy:
+ content: "{{ prometheus_exporter_server_cert.certificate }}"
+ dest: /etc/ssl/prometheus/exporter/crt.pem
+ notify: restart prometheus-exporter-exporter
+
+- name: slurp CA certificate
+ delegate_to: "{{ prometheus_server }}"
+ slurp:
+ src: /etc/ssl/prometheus/ca-crt.pem
+ register: prometheus_exporter_ca_certificate
+
+- name: install CA certificate
+ copy:
+ content: "{{ prometheus_exporter_ca_certificate.content | b64decode }}"
+ dest: /etc/ssl/prometheus/ca-crt.pem
diff --git a/roles/monitoring/prometheus/exporter/base/templates/nginx-vhost.conf.j2 b/roles/monitoring/prometheus/exporter/base/templates/nginx-vhost.conf.j2
deleted file mode 100644
index e032ca3d..00000000
--- a/roles/monitoring/prometheus/exporter/base/templates/nginx-vhost.conf.j2
+++ /dev/null
@@ -1,15 +0,0 @@
-server {
- listen {{ prometheus_exporter_port }};
- listen [::]:{{ prometheus_exporter_port }};
- server_name _;
-
- ## TODO: configure ssl
-
- location / {
- return 404 "unknown exporter: $uri\n";
- }
- include /etc/prometheus-exporter/exporters-enabled/*;
-
- access_log /var/log/nginx/access-prometheus-exporter.log;
- error_log /var/log/nginx/error-prometheus-exporter.log;
-}
diff --git a/roles/monitoring/prometheus/exporter/base/templates/service.j2 b/roles/monitoring/prometheus/exporter/base/templates/service.j2
new file mode 100644
index 00000000..c24baf43
--- /dev/null
+++ b/roles/monitoring/prometheus/exporter/base/templates/service.j2
@@ -0,0 +1,32 @@
+[Unit]
+Description=Prometheus exporter proxy
+
+[Service]
+Restart=always
+User=prometheus-exporter
+ExecStart=/usr/bin/prometheus-exporter-exporter -config.dirs=/etc/prometheus/exporter/enabled -config.file="" -web.listen-address="" -web.tls.listen-address="{{ prometheus_exporter_listen }}" -web.tls.cert="/etc/ssl/prometheus/exporter/crt.pem" -web.tls.key="/etc/ssl/prometheus/exporter/key.pem" --web.tls.ca="/etc/ssl/prometheus/ca-crt.pem" -web.tls.verify
+{# TODO: implement reloading once the exporter_exporter supports this #}
+
+# systemd hardening-options
+AmbientCapabilities=
+CapabilityBoundingSet=
+DeviceAllow=/dev/null rw
+DevicePolicy=strict
+LockPersonality=true
+MemoryDenyWriteExecute=true
+NoNewPrivileges=true
+PrivateDevices=true
+PrivateTmp=true
+PrivateUsers=true
+ProtectControlGroups=true
+ProtectHome=true
+ProtectKernelModules=true
+ProtectKernelTunables=true
+ProtectSystem=strict
+RemoveIPC=true
+RestrictNamespaces=true
+RestrictRealtime=true
+SystemCallArchitectures=native
+
+[Install]
+WantedBy=multi-user.target