Skip to content

Commit 6428baf

Browse files
Single PBS exporter with target config
Co-authored-by: 33Fraise33 <33Fraise33@users.noreply.github.com>
1 parent e900502 commit 6428baf

5 files changed

Lines changed: 71 additions & 42 deletions

File tree

playbooks/host_files/beokpdcovm01/files/prometheus/alerts.d/pbs.rules.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
groups:
33
- name: pbs.rules
44
rules:
5-
- alert: PBSBackupFailed
5+
- alert: PBS - Backup Failed
66
expr: pbs_task_status{task_type="backup",status=~"(?i:failed|error)"} == 1
77
for: 10m
88
labels:
@@ -11,7 +11,7 @@ groups:
1111
summary: "PBS backup failed on {{ $labels.node_name }}"
1212
description: "Backup {{ $labels.task }} for datastore {{ $labels.datastore }} failed."
1313

14-
- alert: PBSVerificationFailed
14+
- alert: PBS - Verification Failed
1515
expr: pbs_task_status{task_type="verify",status=~"(?i:failed|error)"} == 1
1616
for: 10m
1717
labels:
@@ -20,7 +20,7 @@ groups:
2020
summary: "PBS verification failed on {{ $labels.node_name }}"
2121
description: "Verification {{ $labels.task }} for datastore {{ $labels.datastore }} failed."
2222

23-
- alert: PBSSyncFailed
23+
- alert: PBS - Sync Failed
2424
expr: pbs_task_status{task_type="sync",status=~"(?i:failed|error)"} == 1
2525
for: 10m
2626
labels:

playbooks/host_files/beokpdcovm01/templates/prometheus/prometheus.yml.j2

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -263,19 +263,15 @@ scrape_configs:
263263
- "prometheus-adguard_exporter:9618"
264264

265265
{% if prometheus.features.pbs_exporter | default(false) %}
266-
{% for pbs_instance in pbs_exporter_instances | default([]) %}
267-
- job_name: 'pbs_exporter_{{ pbs_instance.name }}'
266+
- job_name: 'pbs_exporter'
268267
metrics_path: /probe
269268
http_sd_configs:
270269
- <<: *netbox_auth
271270
url: https://netbox.unitix.be/api/plugins/prometheus-sd/virtual-machines/?status=active&tag=pbs
272271
relabel_configs:
273272
- source_labels: [__meta_netbox_name]
274-
regex: '^{{ pbs_instance.netbox_name | regex_escape }}$'
275-
action: keep
276-
- source_labels: [__meta_netbox_primary_ip]
277273
target_label: __param_target
278-
- source_labels: [__param_target]
274+
- source_labels: [__meta_netbox_primary_ip]
279275
target_label: instance
280276
- source_labels: [__meta_netbox_name]
281277
target_label: node_name
@@ -286,9 +282,8 @@ scrape_configs:
286282
- source_labels: [__meta_netbox_role_slug]
287283
target_label: device_role
288284
- target_label: __address__
289-
replacement: "prometheus-pbs-exporter-{{ pbs_instance.name }}:9569"
285+
replacement: "prometheus-pbs_exporter:9569"
290286

291-
{% endfor %}
292287
{% endif %}
293288

294289
- job_name: "hass"

playbooks/host_vars/beokpdcovm01.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ prometheus:
77
features:
88
pbs_exporter: true
99

10+
# Each target is keyed by the PBS VM's NetBox name. The target must be the
11+
# endpoint accepted by the PBS exporter; token secrets belong in Vault.
12+
# pbs_exporter_targets:
13+
# - netbox_name: pbs.example
14+
# target: https://pbs.example:8007
15+
# api_token_id: prometheus@pbs!exporter
16+
# api_token_secret: !vault |
17+
# $ANSIBLE_VAULT;1.1;AES256
18+
1019
cloudflared:
1120
docker_network: services
1221
service_token: !vault |
Lines changed: 47 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,91 @@
11
---
2-
- name: Validate PBS exporter instances list
2+
- name: Validate PBS exporter targets list
33
ansible.builtin.assert:
44
that:
5-
- pbs_exporter_instances is defined
6-
- pbs_exporter_instances is sequence
7-
- pbs_exporter_instances is not string
8-
- pbs_exporter_instances | length > 0
9-
fail_msg: >-
10-
pbs_exporter_instances must be a non-empty inventory list.
5+
- pbs_exporter_targets is defined
6+
- pbs_exporter_targets is sequence
7+
- pbs_exporter_targets is not string
8+
- pbs_exporter_targets | length > 0
9+
fail_msg: pbs_exporter_targets must be a non-empty inventory list.
1110
no_log: true
1211

13-
- name: Validate PBS exporter instances
12+
- name: Validate PBS exporter targets
1413
ansible.builtin.assert:
1514
that:
16-
- item.name is defined
17-
- item.name is string
18-
- item.name is match('^[a-z0-9][a-z0-9-]*$')
1915
- item.netbox_name is defined
2016
- item.netbox_name is string
2117
- item.netbox_name | length > 0
18+
- item.target is defined
19+
- item.target is string
20+
- item.target | length > 0
2221
- item.api_token_id is defined
2322
- item.api_token_id is string
2423
- item.api_token_id | length > 0
2524
- item.api_token_secret is defined
2625
- item.api_token_secret is string
2726
- item.api_token_secret | length > 0
2827
fail_msg: >-
29-
Every PBS exporter instance must define a lowercase name, netbox_name,
30-
api_token_id, and api_token_secret.
31-
loop: "{{ pbs_exporter_instances }}"
28+
Every PBS exporter target must define netbox_name, target, api_token_id,
29+
and api_token_secret.
30+
loop: "{{ pbs_exporter_targets }}"
3231
loop_control:
3332
label: hidden
3433
no_log: true
3534

36-
- name: Validate unique PBS exporter instance selectors
35+
- name: Validate unique PBS exporter target selectors
3736
ansible.builtin.assert:
3837
that:
3938
- >-
40-
pbs_exporter_instances | map(attribute='name') | unique | list | length
41-
== pbs_exporter_instances | length
39+
pbs_exporter_targets | map(attribute='netbox_name') | unique | list | length
40+
== pbs_exporter_targets | length
4241
- >-
43-
pbs_exporter_instances | map(attribute='netbox_name') | unique | list | length
44-
== pbs_exporter_instances | length
45-
fail_msg: PBS exporter instance names and NetBox names must be unique.
42+
pbs_exporter_targets | map(attribute='target') | unique | list | length
43+
== pbs_exporter_targets | length
44+
fail_msg: PBS exporter NetBox names and targets must be unique.
45+
no_log: true
46+
47+
- name: Create PBS exporter config directory
48+
ansible.builtin.file:
49+
path: "{{ docker.dir.config }}/prometheus_pbs_exporter"
50+
state: directory
51+
owner: root
52+
group: root
53+
mode: "0700"
4654
no_log: true
4755

48-
- name: Remove legacy Prometheus PBS exporter
56+
- name: Render PBS exporter targets
57+
ansible.builtin.template:
58+
src: pbs_targets.yml.j2
59+
dest: "{{ docker.dir.config }}/prometheus_pbs_exporter/targets.yml"
60+
owner: root
61+
group: root
62+
mode: "0600"
63+
no_log: true
64+
65+
- name: Remove legacy per-target PBS exporters
4966
community.docker.docker_container:
50-
name: prometheus-pbs_exporter
67+
name: "prometheus-pbs-exporter-{{ item.name }}"
5168
state: absent
69+
loop: "{{ pbs_exporter_instances | default([]) }}"
70+
loop_control:
71+
label: hidden
5272
no_log: true
5373

54-
- name: Setup Prometheus PBS exporters
74+
- name: Setup Prometheus PBS exporter
5575
community.docker.docker_container:
56-
name: "prometheus-pbs-exporter-{{ item.name }}"
76+
name: prometheus-pbs_exporter
5777
image: "{{ pbs_exporter_image | default('natrontech/pbs-exporter:latest') }}"
5878
networks:
5979
- name: monitoring
6080
dns_servers: "{{ dns.servers }}"
61-
env:
62-
PBS_TOKEN_ID: "{{ item.api_token_id }}"
63-
PBS_TOKEN_SECRET: "{{ item.api_token_secret }}"
64-
PBS_TLS_INSECURE: "true"
81+
volumes:
82+
- "{{ docker.dir.config }}/prometheus_pbs_exporter/targets.yml:/config/targets.yml:ro"
83+
command: "--config.file=/config/targets.yml"
6584
restart: true
6685
restart_policy: always
6786
state: started
6887
pull: true
6988
labels:
7089
traefik.enable: "false"
7190
com.unitix.prometheus.pbs-exporter: "true"
72-
loop: "{{ pbs_exporter_instances }}"
73-
loop_control:
74-
label: hidden
7591
no_log: true
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
targets:
3+
{% for pbs_target in pbs_exporter_targets %}
4+
- name: "{{ pbs_target.netbox_name }}"
5+
target: "{{ pbs_target.target }}"
6+
token_id: "{{ pbs_target.api_token_id }}"
7+
token_secret: "{{ pbs_target.api_token_secret }}"
8+
tls_insecure: true
9+
{% endfor %}

0 commit comments

Comments
 (0)