From 64fcc80914ff144f962cc59f92d4f2a4a472179f Mon Sep 17 00:00:00 2001 From: Ernestas Poskus Date: Tue, 12 Dec 2017 20:00:09 +0200 Subject: [PATCH] Add blackbox exporter --- README.md | 9 +++++++++ defaults/main.yml | 23 ++++++++++++++++++++++ docs/blackbox_exporter.md | 21 ++++++++++++++++++++ handlers/main.yml | 12 ++++++++++++ tasks/install-blackbox_exporter.yml | 27 ++++++++++++++++++++++++++ tasks/main.yml | 5 +++++ templates/blackbox.yml.j2 | 3 +++ templates/blackbox_exporter.service.j2 | 22 +++++++++++++++++++++ tests/playbook.yml | 14 +++++++++++++ tests/test.yml | 21 ++++++++++++++++++++ vars/blackboxexporter.yml | 8 ++++++++ vars/main.yml | 3 +++ 12 files changed, 168 insertions(+) create mode 100644 docs/blackbox_exporter.md create mode 100644 tasks/install-blackbox_exporter.yml create mode 100644 templates/blackbox.yml.j2 create mode 100644 templates/blackbox_exporter.service.j2 create mode 100644 vars/blackboxexporter.yml diff --git a/README.md b/README.md index b7d2326..401c0f2 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ Playbook installs and manages services using systemd. Currently supported: - Node Exporter (collects metrics of host machine) - Alert manager - Push gateway + - SNMP exporter + - Blackbox exporter Playbook includes extensive configuration options check default/main.yml @@ -35,6 +37,7 @@ prometheus_node_exporter_install: true prometheus_alert_manager_install: true prometheus_push_gateway_install: false prometheus_snmp_exporter_install: false +prometheus_blackbox_exporter_install: false prometheus_owner: 'prometheus' prometheus_group: 'prometheus' @@ -49,6 +52,7 @@ prometheus_alert_manager_data_dir: "{{ prometheus_lib_dir }}/alertmanager" prometheus_alert_manager_config_dir: "{{ prometheus_config_dir }}/alertmanager" prometheus_alert_manager_templates_dir: "{{ prometheus_config_dir }}/alertmanager/templates" prometheus_snmp_exporter_config_dir: "{{ prometheus_config_dir }}/snmpexporter" +prometheus_blackbox_exporter_config_dir: "{{ prometheus_config_dir }}/blackboxexporter" # Prometheus prometheus_version: '2.0.0' @@ -65,6 +69,9 @@ prometheus_push_gateway_version: '0.4.0' # SNMP exporter prometheus_snmp_exporter_version: '0.8.0' + +# Blackbox exporter +prometheus_blackbox_exporter_version: '0.11.0' ``` ![DOCS: Prometheus variables](/docs/prometheus.md) @@ -77,6 +84,8 @@ prometheus_snmp_exporter_version: '0.8.0' ![DOCS: SNMP exporter variables](/docs/snmp_exporter.md) +![DOCS: Blackbox exporter variables](/docs/blackbox_exporter.md) + Dependencies ------------ diff --git a/defaults/main.yml b/defaults/main.yml index d838ebd..db56d2e 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -6,6 +6,7 @@ prometheus_node_exporter_install: true prometheus_alert_manager_install: true prometheus_push_gateway_install: false prometheus_snmp_exporter_install: false +prometheus_blackbox_exporter_install: false prometheus_owner: 'prometheus' prometheus_group: 'prometheus' @@ -20,6 +21,7 @@ prometheus_alert_manager_data_dir: "{{ prometheus_lib_dir }}/alertmanager" prometheus_alert_manager_config_dir: "{{ prometheus_config_dir }}/alertmanager" prometheus_alert_manager_templates_dir: "{{ prometheus_config_dir }}/alertmanager/templates" prometheus_snmp_exporter_config_dir: "{{ prometheus_config_dir }}/snmpexporter" +prometheus_blackbox_exporter_config_dir: "{{ prometheus_config_dir }}/blackboxexporter" # Prometheus prometheus_version: '2.0.0' @@ -37,6 +39,9 @@ prometheus_push_gateway_version: '0.4.0' # SNMP exporter prometheus_snmp_exporter_version: '0.8.0' +# Blackbox exporter +prometheus_blackbox_exporter_version: '0.11.0' + # Prometheus # https://prometheus.io/docs/operating/configuration/ @@ -352,3 +357,21 @@ prometheus_snmp_exporter_log__level: 'info' # Set the log target and format. Example: "logger:syslog?appname=bob&local=7" or "logger:stdout?json=true" prometheus_snmp_exporter_log__format: 'logger:stderr' + +# Blackbox exporter +# https://github.com/prometheus/blackbox_exporter + +prometheus_black_box_config__file: "{{ prometheus_blackbox_exporter_config_dir }}/blackbox.yml" +# Blackbox exporter configuration file. + +prometheus_black_box_web__listen_address: ':9115' +# The address to listen on for HTTP requests. + +prometheus_black_box_timeout_offset: '0.5' +# Offset to subtract from timeout in seconds. + +prometheus_black_box_log__level: 'info' +# Only log messages with the given severity or above. One of: [debug, info, warn, error] + +prometheus_black_box_config_modules: +# Blackbox modules config in format of YAML diff --git a/docs/blackbox_exporter.md b/docs/blackbox_exporter.md new file mode 100644 index 0000000..ca2c9f5 --- /dev/null +++ b/docs/blackbox_exporter.md @@ -0,0 +1,21 @@ +# Blackbox exporter variables + +```yaml +# Blackbox exporter +# https://github.com/prometheus/blackbox_exporter + +prometheus_black_box_config__file: "{{ prometheus_blackbox_exporter_config_dir }}/blackbox.yml" +# Blackbox exporter configuration file. + +prometheus_black_box_web__listen_address: ':9115' +# The address to listen on for HTTP requests. + +prometheus_black_box_timeout_offset: '0.5' +# Offset to subtract from timeout in seconds. + +prometheus_black_box_log__level: 'info' +# Only log messages with the given severity or above. One of: [debug, info, warn, error] + +prometheus_black_box_config_modules: +# Blackbox modules config in format of YAML +``` diff --git a/handlers/main.yml b/handlers/main.yml index 9db2526..21d58cb 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -48,3 +48,15 @@ - name: start snmpexporter service: name=snmpexporter state=started + +- name: restart blackboxexporter + service: name=blackboxexporter state=restarted enabled=yes + +- name: stop blackboxexporter + service: name=blackboxexporter state=stopped + +- name: start blackboxexporter + service: name=blackboxexporter state=started + +- name: reload blackboxexporter + service: name=blackboxexporter state=reloaded diff --git a/tasks/install-blackbox_exporter.yml b/tasks/install-blackbox_exporter.yml new file mode 100644 index 0000000..ee931dc --- /dev/null +++ b/tasks/install-blackbox_exporter.yml @@ -0,0 +1,27 @@ +- include_vars: 'blackboxexporter.yml' + +- name: Download and extract Prometheus blackbox_exporter tarball + unarchive: + src: "{{ prometheus_blackbox_exporter_tarball_url }}" + dest: "{{ prometheus_install_dir }}" + owner: "{{ prometheus_owner }}" + group: "{{ prometheus_group }}" + copy: no + creates: "{{ prometheus_install_dir }}/{{ prometheus_blackbox_exporter_archive }}" + +- name: Copy blackbox exporter config + template: + src: blackbox.yml.j2 + dest: "{{ prometheus_blackbox_exporter_config_dir }}/blackbox.yml" + owner: "{{ prometheus_owner }}" + group: "{{ prometheus_group }}" + notify: + - reload blackboxexporter + +- name: Install Prometheus blackbox exporter systemd service + template: + src: blackbox_exporter.service.j2 + dest: /etc/systemd/system/blackboxexporter.service + notify: + - reload daemon + - restart blackboxexporter diff --git a/tasks/main.yml b/tasks/main.yml index 7dc0787..3350f40 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -37,6 +37,7 @@ - "{{ prometheus_alert_manager_templates_dir }}" - "{{ prometheus_rules_dir }}" - "{{ prometheus_snmp_exporter_config_dir }}" + - "{{ prometheus_blackbox_exporter_config_dir }}" - name: Install Prometheus include: install-prometheus.yml @@ -57,3 +58,7 @@ - name: Install Prometheus SNMP exporter include: install-snmp_exporter.yml when: prometheus_snmp_exporter_install + +- name: Install Prometheus Blackbox exporter + include: install-blackbox_exporter.yml + when: prometheus_blackbox_exporter_install diff --git a/templates/blackbox.yml.j2 b/templates/blackbox.yml.j2 new file mode 100644 index 0000000..921db03 --- /dev/null +++ b/templates/blackbox.yml.j2 @@ -0,0 +1,3 @@ +{% if prometheus_black_box_config_modules is not none %} +{{ {'modules': prometheus_black_box_config_modules} | to_nice_yaml }} +{% endif %} diff --git a/templates/blackbox_exporter.service.j2 b/templates/blackbox_exporter.service.j2 new file mode 100644 index 0000000..30c2190 --- /dev/null +++ b/templates/blackbox_exporter.service.j2 @@ -0,0 +1,22 @@ +# {{ansible_managed}} + +[Unit] +Description=Prometheus blackbox exporter service +After=network.target +Wants=network.target + +[Service] +ExecStart={{ prometheus_install_dir }}/{{ prometheus_blackbox_exporter_archive }}/blackbox_exporter {% for config in prometheus_blackbox_exporter_service_config if config[1] is not none %}--{{ config[0] }}={{ config[1] }} {% endfor %} + +ExecReload=/bin/kill -HUP $MAINPID + +Restart=always +RestartSec=20 +TimeoutSec=300 +User={{prometheus_owner}} +Group={{prometheus_group}} +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target diff --git a/tests/playbook.yml b/tests/playbook.yml index edecfa1..0fa1374 100644 --- a/tests/playbook.yml +++ b/tests/playbook.yml @@ -8,6 +8,7 @@ prometheus_alert_manager_install: true prometheus_push_gateway_install: true prometheus_snmp_exporter_install: true + prometheus_blackbox_exporter_install: true prometheus_alert_manager_config_global: slack_api_url: 'https://github.com/ernestas-poskus/ansible-prometheus/pull/42' prometheus_alert_manager_config_receivers: @@ -21,3 +22,16 @@ title: "[[ range $Alerts ]][[ $Annotations.summary ]]\n[[ end ]]" text: "[[ range $Alerts ]][[ $Annotations.description ]]\n[[ end ]]" send_resolved: true + prometheus_black_box_config_modules: + http_2xx: + prober: http + http: + irc_banner: + prober: tcp + tcp: + query_response: + - send: "NICK prober" + - send: "USER prober prober prober :prober" + - expect: "PING :([^ ]+)" + send: "PONG ${1}" + - expect: "^:[^ ]+ 001" diff --git a/tests/test.yml b/tests/test.yml index d6c45b2..e8008b2 100644 --- a/tests/test.yml +++ b/tests/test.yml @@ -56,3 +56,24 @@ - shell: "test -f /etc/prometheus/snmpexporter/snmp.yml" register: status failed_when: status.rc != 0 + + - name: Check if blackbox exporter service is enabled + command: systemctl is-enabled blackboxexporter + register: command_result + failed_when: "'disabled' in command_result.stdout" + + - shell: "systemctl status blackboxexporter | grep -i running" + register: status + failed_when: status.rc != 0 + + - shell: "systemctl reload blackboxexporter" + register: status + failed_when: status.rc != 0 + + - shell: "test -f /etc/prometheus/blackboxexporter/blackbox.yml" + register: status + failed_when: status.rc != 0 + + - shell: "grep 'NICK prober' /etc/prometheus/blackboxexporter/blackbox.yml" + register: status + failed_when: status.rc != 0 diff --git a/vars/blackboxexporter.yml b/vars/blackboxexporter.yml new file mode 100644 index 0000000..5f40814 --- /dev/null +++ b/vars/blackboxexporter.yml @@ -0,0 +1,8 @@ +############################################################ +# Auto generated +############################################################ +prometheus_blackbox_exporter_service_config: + - ['config.file', "{{ prometheus_black_box_config__file }}"] + - ['web.listen-address', "{{ prometheus_black_box_web__listen_address }}"] + - ['timeout-offset', "{{ prometheus_black_box_timeout_offset }}"] + - ['log.level', "{{ prometheus_black_box_log__level }}"] diff --git a/vars/main.yml b/vars/main.yml index 4d884d9..e16ff2c 100644 --- a/vars/main.yml +++ b/vars/main.yml @@ -14,3 +14,6 @@ prometheus_push_gateway_tarball_url: "https://github.com/prometheus/pushgateway/ prometheus_snmp_exporter_archive: "snmp_exporter-{{ prometheus_snmp_exporter_version }}.{{ prometheus_platform_architecture }}" prometheus_snmp_exporter_tarball_url: "https://github.com/prometheus/snmp_exporter/releases/download/v{{ prometheus_snmp_exporter_version }}/{{ prometheus_snmp_exporter_archive }}.tar.gz" + +prometheus_blackbox_exporter_archive: "blackbox_exporter-{{ prometheus_blackbox_exporter_version }}.{{ prometheus_platform_architecture }}" +prometheus_blackbox_exporter_tarball_url: "https://github.com/prometheus/blackbox_exporter/releases/download/v{{ prometheus_blackbox_exporter_version }}/{{ prometheus_blackbox_exporter_archive }}.tar.gz"