Основная задача – проверять SSL-сертификаты и уведомлять о том, что срок действия сертификата завершается.
Содержание
Запуск blackbox-exporter
Все сервисы мониторинг запускаются из Compose-файла, который деплоится на хост мониторинга из Ansible-шаблона roles/monitoring/templates/prometheus-compose.yml.j2
.
Добавляем туда ещё один контейнер:
... blackbox-exporter: image: prom/blackbox-exporter command: '--config.file=/config/blackbox.yml' # for debug #command: '--config.file=/config/blackbox.yml --log.level=debug' networks: - prometheus ports: - 9115:9115 volumes: - {{ prometheus_configs_path }}/blackbox-exporter.yml:/config/blackbox.yml
Добавляем минимальный файл настроек blackbox-exporter-а – roles/monitoring/templates/blackbox-exporter.yml.j2
:
modules: icmp: prober: icmp timeout: 5s http_200_module: prober: http timeout: 5s http:
Обновляем конфиг самого Prometheus – файл roles/monitoring/templates/prometheus-server-conf.yml.j2
:
... - job_name: 'blackbox' metrics_path: /probe params: module: - http_200_module - icmp static_configs: - targets: - http://rtfm.co.ua - https://rtfm.co.ua relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox-exporter:9115
Добавляем задачу копирования файла настроек blackbox-exporter на хост:
... - name: "Copy blackbox-exporter config {{ prometheus_configs_path }}/blackbox-exporter.yml" template: src: templates/blackbox-exporter.yml.j2 dest: "{{ prometheus_configs_path }}/blackbox-exporter.yml" owner: "{{ prometheus_user }}" group: "{{ prometheus_user }}" ...
Деплоим всё на хост мониторинга, проверяем blackbox:
SSL expire
Среди прочих метрик – blackbox возвращает метрику probe_ssl_earliest_cert_expiry
, в которой указывается дата окончания действия сертификата в формате UNIX-time:
Можно воспользоваться конвертором https://www.epochconverter.com для проверки данных.
Используя его и функцию time()
– можно создать правило, которое далее используем для отправки уведомлений о скором завершении срока действия сертификата, например – за 30 дней:
probe_ssl_earliest_cert_expiry{job="blackbox"} - time() < 86400 * 30
Alertmanager
Следующим шагом – добавим Alertmanager.
Обновляем Compose файл:
alertmanager: image: prom/alertmanager networks: - prometheus ports: - 9093:9093 volumes: - {{ prometheus_configs_path }}/alertmanager_config.yml:/etc/alertmanager/config.yml command: - '--config.file=/etc/alertmanager/config.yml'
Добавляем интеграцию Slack. Описано тут>>>.
Создаём файл настроек Alertmanager roles/monitoring/templates/alertmanager_config.yml.j2
– описываем настройки отправки почты и Slack:
global: smtp_smarthost: 'mail.domain.tld:25' smtp_from: '[email protected]' smtp_auth_username: 'user' smtp_auth_password: 'pass' route: repeat_interval: 1h receiver: default receivers: - name: 'default' email_configs: - to: '[email protected]' slack_configs: - api_url: https://hooks.slack.com/services/T16***ZAj title: ":scream: {% raw %}{{ .CommonAnnotations.summary }}{% endraw %}" text: "{% raw %}{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}{% endraw %}"
В text
циклом получаем description
алертов.
{ % raw % }
и {% endraw %}
используем, что бы заэкранировать переменные шаблонизатора Prometheus.
Создаём файл roles/monitoring/templates/alert.rules.j2
с настройками алертов, пока только одно:
groups: - name: ssl_expiry.rules rules: - alert: SSLCertExpiringSoon expr: probe_ssl_earliest_cert_expiry{job="blackbox"} - time() < 86400 * 30 for: 10m annotations: summary: 'SSL expire alert' description: "SSL certificate for the {% raw %}{{ $labels.instance }}{% endraw %} will expire soon!"
$labels.instance
будет содержать имя домена, для которого сработал алерт.
В задачи добавляем копирование обоих файлов:
... - name: "Copy Alertmanager config {{ prometheus_configs_path }}/alertmanager_config.yml" template: src: templates/alertmanager_config.yml.j2 dest: "{{ prometheus_configs_path }}/alertmanager_config.yml" owner: "{{ prometheus_user }}" group: "{{ prometheus_user }}" - name: "Copy Alertmanager alert rules {{ prometheus_configs_path }}/alert.rules" template: src: templates/alert.rules.j2 dest: "{{ prometheus_configs_path }}/alert.rules" owner: "{{ prometheus_user }}" group: "{{ prometheus_user }}" ...
Обновляем файл настроек Prometheus сервера – указываем URL Alertmanager-а, и файл с правилами алертов:
... alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 rule_files: - "alert.rules" ...
Обновляем Compose – добавляем маппинг файла алертов:
... prometheus-server: image: prom/prometheus networks: - prometheus ports: - 9090:9090 volumes: - {{ prometheus_configs_path }}/prometheus-server-conf.yml:/etc/prometheus.yml - {{ prometheus_configs_path }}/alert.ruls:/etc/alert.rules - {{ prometheus_data_path }}:/prometheus/data/ command: - '--config.file=/etc/prometheus.yml' - '--web.external-url=https://{{ inventory_hostname }}/prometheus' restart: always ...
Деплоим, проверяем:
Готово.