![](https://habrastorage.org/getpro/habr/upload_files/adb/6fe/3d5/adb6fe3d5a8668be23dfda4fb097619e.png)
В данной серии статей описан процесс создания первого pet-проекта для начинающего инженера в DevOps:
Глава 1: Введение и подготовка стенда
Глава 2: Настройка центра сертификации и репозитория
Глава 4: Настройка мониторинга
Друзья, хочу ответить на комментарии об отсутствии в данной серии статей инструментов DevOps - Terraform, Ansible, Kubernetes, GitLab CI/CD и прочих инструментов. Полностью согласен с тем, что DevOps без вышеупомянутых инструментов существовать не может.
Данная серия статей является отправной точкой в изучении DevOps и уверен, что именно начинающим инженерам данный материал точно будет полезен. Здесь большой акцент сделан на написании скриптов. Цель данного pet-проекта - практическое ознакомление с Linux перед тем как двигаться дальше в DevOps - именно поэтому название «Проект юного DevOps». В планах написание следующей серии статей уже с углублением в DevOps и его инструменты.
Спасибо за конструктивные комментарии, которые позволяют откорректировать материал и улучшить его качество. Прошу поддержать мое начинание, всем хорошего дня!
Настройка Prometheus
Prometheus — это система мониторинга и оповещений, хранящая и обрабатывающая метрики, собираемые из экспортеров в Time Series Database (TSDB). В отличие от SQl-like СУБД, Prometheus сам собирает метрики по указанным хостам. Для работы с метриками в Prometheus используется язык запрос PromQL. Он позволяет составлять сложные запросы и использовать математические операторы. Результат запроса может быть выведен в табличной или графической форме.
Зайдем на vm «monitor», применим bash-скрипт «vm-start.sh» и приступим к настройке Prometheus:
Скачаем исходные файлы Prometheus версии 2.47.0 c официальной страницы разработчиков на GitHub в домашнюю директорию и выполним ручную установку:
wget -P ~/ https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
tar xvf ~/prometheus-2.47.0.linux-amd64.tar.gz && cd ~/prometheus-2.47.0.linux-amd64
sudo cp prometheus /usr/bin/
sudo cp promtool /usr/bin/
sudo ln -s /usr/bin/prometheus /usr/local/bin/prometheus
sudo ln -s /usr/bin/promtool /usr/local/bin/promtool
sudo mkdir /etc/prometheus
sudo cp prometheus.yml /etc/prometheus
sudo cp -r consoles /etc/prometheus
sudo cp -r console_libraries /etc/prometheus
sudo mkdir /var/lib/prometheus
Заметка
В других версиях Prometheus процесс и особенности настройки могут отличаться от описанных в данной статье.
Настройка HTTPS c аутентификацией
На vm «ca» сгенерируем новую подписанную пару ключей и перенесем на vm «monitor» в директорию «/etc/prometheus»:
sudo cp ~/monitor.justnikobird.ru.crt /etc/prometheus/
sudo cp ~/monitor.justnikobird.ru.key /etc/prometheus/
Подготовим хэш пароля для нового пользователя - скачаем необходимый пакет с инструментами и сгенерируем пароль «password» для пользователя «admin»:
sudo apt-get install -y apache2-utils
htpasswd -nbB -C 10 admin "password"
В результате выполнения команды мы получим следующую строку:
admin:$2y$10$iWOlBiff2IDDovW2wy2SauStp7ahuHpOULM2W7yQ6JpNcbDKeBPYS
Создадим файл «/etc/prometheus/web.yml», куда внесем настройки https:
tls_server_config:
# Certificate and key files for server to use to authenticate to client.
cert_file: monitor.justnikobird.ru.crt
key_file: monitor.justnikobird.ru.key
basic_auth_users:
admin: '$2y$10$iWOlBiff2IDDovW2wy2SauStp7ahuHpOULM2W7yQ6JpNcbDKeBPYS'
Настройка технической учетной записи
Создадим техническую учетную запись и группу «prometheus» для повышения безопасности работы программы:
sudo addgroup --system "prometheus" --quiet
sudo adduser --system --home /usr/share/prometheus --no-create-home --ingroup "prometheus" --disabled-password --shell /bin/false "prometheus"
Выдадим права ТУЗ на владение файлами программы:
sudo chown -R prometheus:prometheus /var/lib/prometheus/
sudo chmod -R 755 /var/lib/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus/
sudo chmod -R 755 /etc/prometheus/
sudo chmod 640 /etc/prometheus/*.crt
sudo chmod 640 /etc/prometheus/*.key
sudo chown prometheus:prometheus /usr/bin/prometheus
sudo chown -h prometheus:prometheus /usr/local/bin/prometheus
sudo chmod 755 /usr/bin/prometheus
sudo chown prometheus:prometheus /usr/bin/promtool
sudo chown -h prometheus:prometheus /usr/local/bin/promtool
sudo chmod 755 /usr/bin/promtool
Настройка systemd unit
От имени пользователя «root» создадим systemd-юнит «/etc/systemd/system/prometheus.service» для запуска Prometheus:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.config.file=/etc/prometheus/web.yml
[Install]
WantedBy=multi-user.target
Запустим Prometheus и настроим автоматический запуск:
sudo systemctl daemon-reload
sudo systemctl restart prometheus.service
sudo systemctl enable prometheus.service
Сервис Prometheus прослушивает порт 9090.
Настройка iptables
Выполним настройку iptables:
sudo iptables -A INPUT -p tcp --dport 9090 -j ACCEPT -m comment --comment prometheus
Сохраним конфигурацию с помощью инструмента iptables-persistent:
sudo apt-get install -y iptables-persistent
sudo service netfilter-persistent save
Теперь можно перейти по ссылке «https://monitor.justnikobird.ru:9090» и убедиться в том, что Prometheus работает корректно.
Настройка экспортеров
Экспортеры Prometheus предоставляют механизм сбора метрик из различных источников и преобразования их в формат, который может быть понятен Prometheus. Это позволяет Prometheus собирать данные из различных систем, даже если они не предоставляют нативную поддержку для этого инструмента мониторинга.
Настройка Node Exporter
Node Exporter - это инструмент для сбора метрик с узлов операционных систем, который позволяет выполнять мониторинг различных характеристик узлов, таких как использования CPU, памяти, сетевой активности и других ресурсов.
Данный экспортер мы установим на все vm стенда.
Зайдем на vm и скачаем исходные файлы Node Exporter версии 1.6.1 c официальной страницы разработчиков на GitHub в домашнюю директорию и выполним ручную установку:
wget -P ~/ https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvf ~/node_exporter-1.6.1.linux-amd64.tar.gz && cd ~/node_exporter-1.6.1.linux-amd64
sudo cp node_exporter /usr/bin/
sudo mkdir /opt/node_exporter
Заметка
В других версиях Node Exporter процесс и особенности настройки могут отличаться от описанных в данной статье.
Настройка HTTPS c аутентификацией
Поместим ранее подписанную пару ключей для vm в рабочую директорию экспортера:
sudo cp ~/example.justnikobird.ru.crt /opt/node_exporter/
sudo cp ~/example.justnikobird.ru.key /opt/node_exporter/
Подготовим хэш пароля для нового пользователя - скачаем необходимый пакет с инструментами и сгенерируем пароль «password» для пользователя «admin»:
sudo apt-get install -y apache2-utils
htpasswd -nbB -C 10 admin "password"
В результате выполнения команды мы получим следующую строку:
admin:$2y$10$iWOlBiff2IDDovW2wy2SauStp7ahuHpOULM2W7yQ6JpNcbDKeBPYS
Создадим файл «/opt/node_exporter/web.yml», куда внесем настройки https:
tls_server_config:
# Certificate and key files for server to use to authenticate to client.
cert_file: example.justnikobird.ru.crt
key_file: example.justnikobird.ru.key
basic_auth_users:
admin: '$2y$10$iWOlBiff2IDDovW2wy2SauStp7ahuHpOULM2W7yQ6JpNcbDKeBPYS'
Настройка технической учетной записи
Создадим техническую учетную запись и группу «node_exporter» для повышения безопасности работы программы:
sudo addgroup --system "node_exporter" --quiet
sudo adduser --system --home /usr/share/prometheus --no-create-home --ingroup "node_exporter" --disabled-password --shell /bin/false "node_exporter"
Выдадим права ТУЗ на владение файлами программы:
sudo chmod 755 /usr/bin/node_exporter
sudo chown node_exporter:node_exporter /usr/bin/node_exporter
sudo chmod -R 755 /opt/node_exporter/
sudo chmod 640 /opt/node_exporter/*.crt
sudo chmod 640 /opt/node_exporter/*.key
sudo chown -R node_exporter:node_exporter /opt/node_exporter/
Настройка systemd unit
От имени пользователя «root» создадим systemd-юнит «/etc/systemd/system/node_exporter.service» для запуска Node Exporter:
[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/bin/node_exporter --web.config.file=/opt/node_exporter/web.yml
[Install]
WantedBy=multi-user.target
Запустим Node Exporter и настроим автоматический запуск:
sudo systemctl daemon-reload
sudo systemctl restart node_exporter.service
sudo systemctl enable node_exporter.service
Сервис прослушивает порт 9100
Настройка iptables
Выполним настройку iptables для подключения к экспортеру сервера Prometheus из приватной сети с адресом «10.0.0.6»:
sudo iptables -A INPUT -p tcp -s 10.0.0.6 --dport 9100 -j ACCEPT -m comment --comment prometheus_node_exporter
Заметка
Приватный адрес сервера Prometheus может отличаться от настроенного в данном стенде.
Сохраним конфигурацию с помощью инструмента iptables-persistent:
sudo apt-get install -y iptables-persistent
sudo service netfilter-persistent save
Сборка deb-пакета Node Exporter
Весь процесс сборки я описал в статье «Работа с DEB-пакетами».
Здесь я только помечу следующие данные для сборки:
Файлы, которое буем хранить в пакете:
/opt/node_exporter/web.yml
/usr/bin/node_exporter
/etc/systemd/system/node_exporter.service
install
web.yml opt/node_exporter/
node_exporter usr/bin/
node_exporter.service etc/systemd/system/
control
Source: node-exporter-lab
Section: unknown
Priority: optional
Maintainer: unknown <nikolay@unknown>
Build-Depends: debhelper-compat (= 13)
Standards-Version: 4.6.0
Homepage: <insert the upstream URL, if relevant>
#Vcs-Browser: https://salsa.debian.org/debian/just-node-exporter
#Vcs-Git: https://salsa.debian.org/debian/just-node-exporter.git
Rules-Requires-Root: no
Package: node-exporter-lab
Architecture: all
Depends: ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
postinst
#!/bin/sh
set -e
USER="node_exporter"
GROUP="node_exporter"
if ! getent group "$GROUP" > /dev/null 2>&1 ; then
addgroup --system "$GROUP" --quiet
fi
if ! id "$USER" > /dev/null 2>&1 ; then
adduser --system --home /usr/share/prometheus --no-create-home \
--ingroup "$GROUP" --disabled-password --shell /bin/false \
"$USER"
fi
chown -R $USER:$GROUP /opt/node_exporter
chmod -R 755 /opt/node_exporter
chown $USER:$GROUP /usr/bin/node_exporter
chmod 755 /usr/bin/node_exporter
echo -n "Restarting node_exporter service..."
if command -v systemctl >/dev/null; then
systemctl daemon-reload || true
systemctl enable node_exporter.service || true
systemctl restart node_exporter.service || true
systemctl restart node_exporter.service || true
fi
echo " OK"
prerm
#!/bin/sh
echo 'Stopping and disabling node_exporter service...'
if command -v systemctl >/dev/null; then
systemctl stop node_exporter.service || true
systemctl disable node_exporter.service || true
fi
userdel node_exporter >/dev/null 2>&1 || true
groupdel node_exporter >/dev/null 2>&1 || true
echo " OK"
В результате мы собрали пакет «node-exporter-lab_0.1-1_all.deb».
Далее загрузим новый пакет в локальный репозиторий.
Настройка OpenVPN Exporter
OpenVPN Exporter - предоставлять Prometheus метрики и статистику, связанные с OpenVPN. Экспортер позволяет выполнять мониторинг информации о текущих соединениях, загрузке сервера, статистике использования ресурсов и другие параметры, которые могут быть полезными для анализа и управления инфраструктурой OpenVPN.
Зайдем на vm «vpn» и установим интерпретатор языка Go:
sudo apt-get install -y golang
Скачаем исходные файлы OpenVPN Exporter версии 0.3.0 c официальной страницы разработчиков на GitHub в домашнюю директорию и выполним ручную установку:
wget -P ~/ https://github.com/kumina/openvpn_exporter/archive/refs/tags/v0.3.0.tar.gz
tar xvf v0.3.0.tar.gz && cd ~/openvpn_exporter-0.3.0
Заметка
В других версиях OpenVPN Exporter процесс и особенности настройки могут отличаться от описанных в данной статье.
В переменной «openvpnStatusPaths» конфигурационного файла «~/openvpn_exporter-0.3.0/main.go» укажем путь до лог-фала OpenVPN:
openvpnStatusPaths = flag.String("openvpn.status_paths", "/var/log/openvpn/openvpn-status.log", "Paths at which OpenVPN places its status files.")
Соберем программу из исходников:
sudo go build ~/openvpn_exporter-0.3.0/main.go
В результате сборки мы получили бинарный файл «main», который необходимо переименовать и переместить в директорию «/usr/bin»:
sudo cp ~/openvpn_exporter-0.3.0/main /usr/bin/openvpn_exporter
Настройка технической учетной записи
Создадим техническую учетную запись и группу «openvpn_exporter» для повышения безопасности работы программы:
sudo addgroup --system "openvpn_exporter" --quiet
sudo adduser --system --home /usr/share/openvpn_exporter --no-create-home --ingroup "openvpn_exporter" --disabled-password --shell /bin/false "openvpn_exporter"
Добавим в новую группу «openvpn_exporter» пользователя «root»:
sudo usermod -a -G openvpn_exporter root
Теперь изменим права на владение лог-файлом OpenVPN:
sudo chgrp openvpn_exporter /var/log/openvpn/openvpn-status.log
sudo chmod 660 /var/log/openvpn/openvpn-status.log
Выдадим права ТУЗ на владение файлами программы:
sudo chown openvpn_exporter:openvpn_exporter /usr/bin/openvpn_exporter
sudo chmod 755 /usr/bin/openvpn_exporter
Настройка systemd unit
От имени пользователя «root» создадим systemd-юнит «/etc/systemd/system/openvpn_exporter.service» для запуска OpenVPN Exporter:
[Unit]
Description=Prometheus OpenVPN Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=openvpn_exporter
Group=openvpn_exporter
Type=simple
ExecStart=/usr/bin/openvpn_exporter
[Install]
WantedBy=multi-user.target
Запустим OpenVPN Exporter и настроим автоматический запуск:
sudo systemctl daemon-reload
sudo systemctl restart openvpn_exporter.service
sudo systemctl enable openvpn_exporter.service
Сервис прослушивает порт 9176 по протоколу http.
Настройка iptables
Выполним настройку iptables для подключения к экспортеру сервера Prometheus из приватной сети с адресом «10.0.0.6»:
sudo iptables -A INPUT -p tcp -s 10.0.0.6 --dport 9176 -j ACCEPT -m comment --comment prometheus_openvpn_exporter
Заметка
Приватный адрес сервера Prometheus может отличаться от настроенного в данном стенде.
Сохраним конфигурацию с помощью инструмента iptables-persistent:
sudo apt-get install -y iptables-persistent
sudo service netfilter-persistent save
Сборка deb-пакета OpenVPN Exporter
Весь процесс сборки я описал в статье «Работа с DEB-пакетами».
Здесь я только помечу следующие данные для сборки:
Файлы, которое буем хранить в пакете:
/usr/bin/openvpn_exporter
/etc/systemd/system/openvpn_exporter.service
install
openvpn_exporter usr/bin/
openvpn_exporter.service etc/systemd/system/
control
Source: openvpn-exporter-lab
Section: unknown
Priority: optional
Maintainer: unknown <nikolay@unknown>
Build-Depends: debhelper-compat (= 13)
Standards-Version: 4.6.0
Homepage: <insert the upstream URL, if relevant>
#Vcs-Browser: https://salsa.debian.org/debian/just-open-vpn-exporter
#Vcs-Git: https://salsa.debian.org/debian/just-open-vpn-exporter.git
Rules-Requires-Root: no
Package: openvpn-exporter-lab
Architecture: all
Depends: ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
postinst
#!/bin/sh
set -e
USER="openvpn_exporter"
GROUP="openvpn_exporter"
OPENVPN_LOGFILE="/var/log/openvpn/openvpn-status.log"
if ! getent group "$GROUP" > /dev/null 2>&1 ; then
addgroup --system "$GROUP" --quiet
fi
if ! id "$USER" > /dev/null 2>&1 ; then
adduser --system --home /usr/share/prometheus --no-create-home \
--ingroup "$GROUP" --disabled-password --shell /bin/false \
"$USER"
fi
sudo usermod -a -G openvpn_exporter root
if [ -f "$OPENVPN_LOGFILE" ]; then
sudo chgrp $GROUP $OPENVPN_LOGFILE
sudo chmod 660 $OPENVPN_LOGFILE
fi
chown $USER:$GROUP /usr/bin/openvpn_exporter
chmod 755 /usr/bin/openvpn_exporter
echo -n "Restarting openvpn-exporter service..."
if command -v systemctl >/dev/null; then
systemctl daemon-reload || true
systemctl enable openvpn_exporter.service || true
systemctl restart openvpn_exporter.service || true
fi
echo " OK"
prerm
#!/bin/sh
USER="openvpn_exporter"
GROUP="openvpn_exporter"
OPENVPN_LOGFILE="/var/log/openvpn/openvpn-status.log"
echo 'Stopping and disabling openvpn-exporter service...'
if command -v systemctl >/dev/null; then
systemctl stop openvpn_exporter.service || true
systemctl disable openvpn_exporter.service || true
fi
if [ -f "$OPENVPN_LOGFILE" ]; then
sudo chgrp root $OPENVPN_LOGFILE
sudo chmod 640 $OPENVPN_LOGFILE
fi
userdel $USER >/dev/null 2>&1 || true
groupdel $GROUP >/dev/null 2>&1 || true
echo " OK"
В результате мы собрали пакет «openvpn-exporter-lab_0.1-1_all.deb».
Далее загрузим новый пакет в локальный репозиторий.
Настройка Nginx Exporter
Nginx Exporter собирает различные метрики, такие как количество запросов, статусы запросов, использование ресурсов, и другие характеристики производительности веб-сервера Nginx.
Зайдем на vm «repo» и скачаем исходные файлы Nginx Exporter версии 0.11.0 c официальной страницы разработчиков на GitHub в домашнюю директорию и выполним ручную установку:
wget -P ~/ https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v0.11.0/nginx-prometheus-exporter_0.11.0_linux_amd64.tar.gz
mkdir ~/nginx-prometheus-exporter_0.11.0_linux_amd64
tar xvf nginx-prometheus-exporter_0.11.0_linux_amd64.tar.gz -C ~/nginx-prometheus-exporter_0.11.0_linux_amd64 && cd ~/nginx-prometheus-exporter_0.11.0_linux_amd64
sudo cp nginx-prometheus-exporter /usr/bin/
sudo mkdir /opt/nginx_exporter
Заметка
В других версиях Nginx Exporter процесс и особенности настройки могут отличаться от описанных в данной статье.
Настройка Nginx
Важно заметить, что для работы экспортера необходимо включить сервис отображения метрик в Nginx.
В конфигурационном файле Nginx должны присутствовать следующие строки:
server {
listen 8080;
location /stub_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
Конфигурационный файл Nginx целиком
server {
listen 1111 ssl default_server;
server_name repo.justnikobird.ru;
auth_basic "Restricted Access!";
auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
ssl_certificate repo.justnikobird.ru.crt;
ssl_certificate_key repo.justnikobird.ru.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/aptly;
location / {
autoindex on;
}
}
# nginx prometheus exporter
server {
listen 8080;
location /stub_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
Настройка HTTPS
Поместим ранее подписанную пару ключей в рабочую директорию экспортера:
sudo cp ~/repo.justnikobird.ru.crt /opt/nginx_exporter/
sudo cp ~/repo.justnikobird.ru.key /opt/nginx_exporter/
Создадим файл «/opt/nginx_exporter/prometheus-nginx-exporter», куда внесем настройки https:
# Set the command-line arguments to pass to the server.
# Due to shell scaping, to pass backslashes for regexes, you need to double
# them (\\d for \d). If running under systemd, you need to double them again
# (\\\\d to mean \d), and escape newlines too.
ARGS="-web.secured-metrics -web.ssl-server-cert /opt/nginx_exporter/repo.justnikobird.ru.crt -web.ssl-server-key /opt/nginx_exporter/repo.justnikobird.ru.key"
Настройка технической учетной записи
Создадим техническую учетную запись и группу «nginx_exporter» для повышения безопасности работы программы:
sudo addgroup --system "nginx_exporter" --quiet
sudo adduser --system --home /usr/share/nginx_exporter --no-create-home --ingroup "nginx_exporter" --disabled-password --shell /bin/false "nginx_exporter"
Выдадим права ТУЗ на владение файлами программы:
sudo chown -R nginx_exporter:nginx_exporter /opt/nginx_exporter
sudo chmod -R 755 /opt/nginx_exporter/
sudo chmod 640 /opt/nginx_exporter/*.crt
sudo chmod 640 /opt/nginx_exporter/*.key
sudo chown nginx_exporter:nginx_exporter /usr/bin/nginx-prometheus-exporter
sudo chmod 755 /usr/bin/nginx-prometheus-exporter
Настройка systemd unit
От имени пользователя «root» создадим systemd-юнит «/etc/systemd/system/nginx_exporter.service» для запуска Nginx Exporter:
[Unit]
Description=NGINX Prometheus Exporter
Documentation=https://github.com/nginxinc/nginx-prometheus-exporter
After=network.target nginx.service
[Service]
Restart=on-failure
User=nginx_exporter
EnvironmentFile=/opt/nginx_exporter/prometheus-nginx-exporter
ExecStart=/usr/bin/nginx-prometheus-exporter $ARGS
[Install]
WantedBy=multi-user.target
Запустим Nginx Exporter и настроим автоматический запуск:
sudo systemctl daemon-reload
sudo systemctl restart nginx_exporter.service
sudo systemctl enable nginx_exporter.service
Сервис прослушивает порт 9113
Настройка iptables
Выполним настройку iptables для подключения к экспортеру сервера Prometheus из приватной сети с адресом «10.0.0.6»:
sudo iptables -A INPUT -p tcp -s 10.0.0.6 --dport 9113 -j ACCEPT -m comment --comment prometheus_nginx_exporter
Заметка
Приватный адрес сервера Prometheus может отличаться от настроенного в данном стенде.
Сохраним конфигурацию с помощью инструмента iptables-persistent:
sudo apt-get install -y iptables-persistent
sudo service netfilter-persistent save
Сборка deb-пакета Nginx Exporter
Весь процесс сборки я описал в статье «Работа с DEB-пакетами».
Здесь я только помечу следующие данные для сборки:
Файлы, которое буем хранить в пакете:
/usr/bin/nginx-prometheus-exporter
/opt/nginx_exporter/prometheus-nginx-exporter
/etc/systemd/system/nginx_exporter.service
install
nginx-prometheus-exporter usr/bin/
prometheus-nginx-exporter opt/nginx_exporter/
nginx_exporter.service etc/systemd/system/
control
Source: nginx-exporter-lab
Section: unknown
Priority: optional
Maintainer: Nikolay <justnikobird@yandex.ru>
Build-Depends: debhelper-compat (= 13)
Standards-Version: 4.6.0
Homepage: <insert the upstream URL, if relevant>
#Vcs-Browser: https://salsa.debian.org/debian/just-nginx-exporter
#Vcs-Git: https://salsa.debian.org/debian/just-nginx-exporter.git
Rules-Requires-Root: no
Package: nginx-exporter-lab
Architecture: all
Depends: ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
postinst
#!/bin/sh
set -e
USER="nginx_exporter"
GROUP="nginx_exporter"
if ! getent group "$GROUP" > /dev/null 2>&1 ; then
addgroup --system "$GROUP" --quiet
fi
if ! id "$USER" > /dev/null 2>&1 ; then
adduser --system --home /usr/share/prometheus --no-create-home \
--ingroup "$GROUP" --disabled-password --shell /bin/false \
"$USER"
fi
chown -R $USER:$GROUP /opt/nginx_exporter/
chmod -R 755 /opt/nginx_exporter/
chown $USER:$GROUP /usr/bin/nginx-prometheus-exporter
chmod 755 /usr/bin/nginx-prometheus-exporter
echo -n "Restarting nginx_exporter service..."
if command -v systemctl >/dev/null; then
systemctl daemon-reload || true
systemctl enable nginx_exporter.service || true
systemctl restart nginx_exporter.service || true
fi
echo " OK"
prerm
#!/bin/sh
echo 'Stopping and disabling nginx-exporter service...'
if command -v systemctl >/dev/null; then
systemctl stop nginx_exporter.service || true
systemctl disable nginx_exporter.service || true
fi
userdel nginx_exporter >/dev/null 2>&1 || true
groupdel nginx_exporter >/dev/null 2>&1 || true
echo " OK"
В результате мы собрали пакет «nginx-exporter-lab_0.1-1_all.deb».
Далее загрузим новый пакет в локальный репозиторий.
Bash-скрипт для экспортеров
Настало время написать bash-скрипт, который сможет выполнить настройку экспортеров автоматически:
exporters.sh
#!/bin/bash
# активируем опцию, которая прерывает выполнение скрипта, если любая команда завершается с ненулевым статусом
set -e
# проверим, запущен ли скрипт от пользователя root
if [[ "${UID}" -ne 0 ]]; then
echo -e "You need to run this script as root!"
exit 1
fi
# проверим подключен ли репозиторий
if [[ ! $(grep -rhE ^deb /etc/apt/sources.list*) == *"deb https://repo.justnikobird.ru:1111/lab focal main"* ]]; then
echo -e "Lab repo not connected!\nPlease run vm_start.sh script!\n"
exit 1
fi
# функция, которая проверяет наличие пакета в системе и в случае его отсутствия выполняет установку
command_check() {
if ! command -v "$1" &>/dev/null; then
echo -e "\n====================\n$2 could not be found!\nInstalling...\n====================\n"
apt-get install -y "$3"
echo -e "\nDONE\n"
fi
}
# функция, которая проверяет наличие правила в iptables и в случае отсутствия применяет его
iptables_add() {
if ! iptables -C "$@" &>/dev/null; then
iptables -A "$@"
fi
}
# функция, которая проверяет корректность введения ip-адреса
ip_request() {
while true; do
read -r -p $'\n'"Enter monitor vm ip (format 10.0.0.6): " ip
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
echo "$ip"
break
fi
done
}
# функция, которая проверяет валидность пути в linux-системе
path_request() {
while true; do
read -r -e -p $'\n'"Please input valid path to ${1}: " path
if [ -f "$path" ]; then
echo "$path"
break
fi
done
}
# установим все необходимые пакеты используя функцию command_check
systemctl restart systemd-timesyncd.service
apt-get update
command_check iptables "Iptables" iptables
command_check netfilter-persistent "Netfilter-persistent" iptables-persistent
command_check basename "Basename" coreutils
command_check htpasswd "Htpasswd" apache2-utils
# выведем в shell меню с предложением выбрать экспортер для установки
while true; do
echo -e "\n--------------------------\n"
echo -e "[1] node exporter\n"
echo -e "[2] openvpn exporter\n"
echo -e "[3] nginx exporter\n"
echo -e "[4] exit\n"
echo -e "--------------------------\n"
read -r -n 1 -p "Select exporter for install: " exporter
case $exporter in
# установим node-exporter
1)
echo -e "\n====================\nNode Exporter Installing...\n====================\n"
# установим ранее собранный пакет node-exporter-lab
apt-get install -y node-exporter-lab
# запросим пути до файлов сертификата и ключа
cert_path=$(path_request certificate)
key_path=$(path_request key)
# отделим названия файлов от путей
cert_file=$(basename "$cert_path")
key_file=$(basename "$key_path")
# переместим файлы ключа и сертификата в рабочую директорию программы и поменяем права на владение
cp "$cert_path" /opt/node_exporter/
cp "$key_path" /opt/node_exporter/
chmod 640 /opt/node_exporter/"$cert_file"
chmod 640 /opt/node_exporter/"$key_file"
chown node_exporter:node_exporter /opt/node_exporter/"$cert_file"
chown node_exporter:node_exporter /opt/node_exporter/"$key_file"
# запросим данные для авторизации и запишем их в конфигурационный файл
read -r -p $'\n'"Node Exporter username: " username
read -r -p $'\n'"Node Exporter password: " -s password
echo -e "tls_server_config:\n cert_file: $cert_file\n key_file: $key_file\n\nbasic_auth_users:\n $username: '$(htpasswd -nbB -C 10 admin "$password" | grep -o "\$.*")'" >/opt/node_exporter/web.yml
# настроим iptables
echo -e "\n====================\nIptables configuration\n====================\n"
monitor_vm_ip=$(ip_request)
iptables_add INPUT -p tcp -s "$monitor_vm_ip" --dport 9100 -j ACCEPT -m comment --comment prometheus_node_exporter
echo -e "\n====================\nSaving iptables config\n====================\n"
service netfilter-persistent save
echo -e "\nDONE\n"
# перезагрузим node-exporter-сервис
systemctl daemon-reload
systemctl restart node_exporter.service
systemctl enable node_exporter.service
echo -e "\n====================\nNode Exporter listening on port 9100\n====================\n"
echo -e "\nOK\n"
;;
2)
echo -e "\n====================\nOpenvpn Exporter Installing...\n====================\n"
# установим ранее собранный пакет openvpn-exporter-lab
apt-get install -y openvpn-exporter-lab
# настроим iptables
echo -e "\n====================\nIptables configuration\n====================\n"
monitor_vm_ip=$(ip_request)
iptables_add INPUT -p tcp -s "$monitor_vm_ip" --dport 9176 -j ACCEPT -m comment --comment prometheus_openvpn_exporter
echo -e "\n====================\nSaving iptables config\n====================\n"
service netfilter-persistent save
echo -e "\nDONE\n"
# перезагрузим openvpn-exporter-сервис
systemctl daemon-reload
systemctl restart openvpn_exporter.service
systemctl enable openvpn_exporter.service
echo -e "\n====================\nOpenvpn Exporter listening on port 9176\n====================\n"
echo -e "\nOK\n"
;;
3)
echo -e "\n====================\nConfigure Nginx /stub_status location on 8080 port before install \n====================\n"
echo -e "\n====================\nNginx Exporter Installing...\n====================\n"
# установим ранее собранный пакет nginx-exporter-lab
apt-get install -y nginx-exporter-lab
# запросим пути до файлов сертификата и ключа
cert_path=$(path_request certificate)
key_path=$(path_request key)
# отделим названия файлов от путей
cert_file=$(basename "$cert_path")
key_file=$(basename "$key_path")
# переместим файлы ключа и сертификата в рабочую директорию программы и поменяем права на владение
cp "$cert_path" /opt/nginx_exporter/
cp "$key_path" /opt/nginx_exporter/
new_cert_path="/opt/nginx_exporter/$cert_file"
new_key_path="/opt/nginx_exporter/$key_file"
chmod 640 "$new_cert_path"
chmod 640 "$new_key_path"
chown nginx_exporter:nginx_exporter "$new_cert_path"
chown nginx_exporter:nginx_exporter "$new_key_path"
# запишем данные о сертификате и ключе в конфигурационный файл
echo 'ARGS="-web.secured-metrics -web.ssl-server-cert '"$new_cert_path"' -web.ssl-server-key '"$new_key_path"'' >/opt/nginx_exporter/prometheus-nginx-exporter
# настроим iptables
echo -e "\n====================\nIptables configuration\n====================\n"
monitor_vm_ip=$(ip_request)
iptables_add INPUT -p tcp -s "$monitor_vm_ip" --dport 9113 -j ACCEPT -m comment --comment prometheus_nginx_exporter
echo -e "\n====================\nSaving iptables config\n====================\n"
service netfilter-persistent save
echo -e "\nDONE\n"
# перезагрузим nginx-exporter-сервис
systemctl daemon-reload
systemctl restart nginx_exporter.service
systemctl enable nginx_exporter.service
echo -e "\n====================\nNginx Exporter listening on port 9113\n====================\n"
echo -e "\nOK\n"
;;
4)
echo -e "\n\nOK\n"
exit 0
;;
*)
echo -e "\n\nUnknown\n"
;;
esac
done
Подключение экспортеров к Prometheus
Зайдем на vm «monitor».
Перенесем файлы сертификатов подключаемых экспортеров на vm «monitor» в рабочую директорию «/etc/prometheus»:
sudo cp ~/ca.justnikobird.ru.crt /etc/prometheus/
sudo cp ~/vpn.justnikobird.ru.crt /etc/prometheus/
sudo cp ~/repo.justnikobird.ru.crt /etc/prometheus/
sudo chmod 640 /etc/prometheus/*.crt
sudo chown prometheus:prometheus /etc/prometheus/*.crt
Для подключения к экспортерам через приватную сеть по доменным именам, выполним настройку DNS в фале «/etc/hosts»:
127.0.0.1 monitor.justnikobird.ru
10.0.0.4 ca.justnikobird.ru
10.0.0.5 vpn.justnikobird.ru
10.0.0.7 repo.justnikobird.ru
Настройка подключения Prometheus к экспортерам выполняется в конфигурационном файле «/etc/prometheus/prometheus.yml» в блоке «scrape_configs»:
Подключение встроенного в Prometheus экспортера
scrape_configs:
- job_name: 'prometheus-monitor'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: monitor.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['monitor.justnikobird.ru:9090']
Подключение Node Exporters
- job_name: 'node-monitor'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: monitor.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['monitor.justnikobird.ru:9100']
- job_name: 'node-ca'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: ca.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['ca.justnikobird.ru:9100']
- job_name: 'node-openvpn'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: vpn.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['vpn.justnikobird.ru:9100']
- job_name: 'node-repo'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: repo.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['repo.justnikobird.ru:9100']
Подключение OpenVPN Exporter
- job_name: 'openvpn'
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['vpn.justnikobird.ru:9176']
Подключение Nginx Exporter
- job_name: 'nginx-repo'
scheme: https
tls_config:
ca_file: repo.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['repo.justnikobird.ru:9113']
Конфигурационный файл Prometheus целиком
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
...
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
...
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus-monitor'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: monitor.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['monitor.justnikobird.ru:9090']
- job_name: 'node-monitor'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: monitor.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['monitor.justnikobird.ru:9100']
- job_name: 'node-ca'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: ca.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['ca.justnikobird.ru:9100']
- job_name: 'node-vpn'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: vpn.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['vpn.justnikobird.ru:9100']
- job_name: 'node-repo'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: repo.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['repo.justnikobird.ru:9100']
- job_name: 'openvpn'
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['vpn.justnikobird.ru:9176']
- job_name: 'nginx-repo'
scheme: https
tls_config:
ca_file: repo.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['repo.justnikobird.ru:9113']
Выполним проверку конфигурации Prometheus с помощью инструмента «promtool»:
sudo promtool check config /etc/prometheus/prometheus.yml
Если проверка пройдена успешно, то можно двигаться дальше.
Настройка iptables
Выполним настройку iptables для возможности получения данных от настроенных экспортеров:
sudo iptables -A OUTPUT -p tcp -d 10.0.0.0/24 --dport 9100 -j ACCEPT -m comment --comment Prometheus_node_exporter
sudo iptables -A OUTPUT -p tcp -d 10.0.0.0/24 --dport 9176 -j ACCEPT -m comment --comment prometheus_openvpn_exporter
sudo iptables -A OUTPUT -p tcp -d 10.0.0.0/24 --dport 9113 -j ACCEPT -m comment --comment prometheus_nginx_exporter
Сохраним конфигурацию с помощью инструмента iptables-persistent:
sudo apt-get install -y iptables-persistent
sudo service netfilter-persistent save
Перезагрузим Prometheus:
sudo systemctl restart prometheus.service
Проверим корректность подключения в web-интерфейсе - во вкладке «Status» выберем пункт «Targets»:
![](https://habrastorage.org/getpro/habr/upload_files/265/9cb/484/2659cb484ec2d2816d5377dfdaf7b0ae.png)
Настройка Prometheus AlertManager
AlertManager — это программа, которая получает алерты от Prometheus, обрабатывает их, группирует и формирует оповещения об инцидентах. AlertManager позволяет гибко настроить условия формирования оповещений и может рассылать их по разным каналам: начиная от электронной почты, заканчивая Telegram.
Зайдем на vm «monitor» и скачаем исходные файлы AlertManager версии 0.26.0 c официальной страницы разработчиков на GitHub в домашнюю директорию и выполним ручную установку:
wget -P ~/ https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
tar xvf ~/alertmanager-0.26.0.linux-amd64.tar.gz && cd ~/alertmanager-0.26.0.linux-amd64
sudo cp amtool /usr/bin/
sudo cp alertmanager /usr/bin/
sudo ln -s /usr/bin/amtool /usr/local/bin/amtool
sudo ln -s /usr/bin/alertmanager /usr/local/bin/alertmanager
sudo cp alertmanager.yml /etc/prometheus/
Подробнее о файлах
amtool: Исполняемый файл, который позволяет просматривать или изменять текущее состояние AlertManager. Другими словами, amtool может отключать оповещения, отключать по истечении срока действия, а также импортировать или запрашивать их. Его можно рассматривать как утилиту для настройки AlertManager без непосредственного изменения конфигурации текущих оповещений.
alertmanager: Исполняемый файл, который используется для запуска сервиса Alert Manager.
alertmanager.yml: Конфигурационный файл AlertManager.
Создадим директорию для хранения данных AlertManager:
sudo mkdir /etc/prometheus/alertmanager_data
Создадим конфигурационный файл, где будем хранить настройки триггеров:
sudo touch /etc/prometheus/rules.yml
Подключим Prometheus к AlertManager в конфигурационном файле «/etc/prometheus/prometheus.yml» в блоке «alerting»:
alerting:
alertmanagers:
- scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: monitor.justnikobird.ru.crt
static_configs:
- targets: ['monitor.justnikobird.ru:9093']
Выполним проверку конфигурации Prometheus с помощью инструмента «promtool»:
sudo promtool check config /etc/prometheus/prometheus.yml
Если проверка пройдена успешно, то можно двигаться дальше.
Настройка HTTPS c аутентификацией
AlertManager и Prometheus будут использовать один конфигурационный файл с настройками https, который мы подготовили ранее:
/etc/prometheus/web.yml
Выдадим права ранее созданной ТУЗ «prometheus» на владение файлами программы:
sudo chown -R prometheus:prometheus /etc/prometheus/alertmanager_data
sudo chmod -R 755 /etc/prometheus/alertmanager_data
sudo chown prometheus:prometheus /usr/bin/amtool
sudo chown -h prometheus:prometheus /usr/local/bin/amtool
sudo chmod 755 /usr/bin/amtool
sudo chown prometheus:prometheus /usr/bin/alertmanager
sudo chown -h prometheus:prometheus /usr/local/bin/alertmanager
sudo chmod 755 /usr/bin/alertmanager
sudo chown prometheus:prometheus /etc/prometheus/alertmanager.yml
sudo chmod 755 /etc/prometheus/alertmanager.yml
sudo chown prometheus:prometheus /etc/prometheus/rules.yml
sudo chmod 755 /etc/prometheus/rules.yml
Настройка получателей алертов:
Перед настройкой алертов необходимо определить с каналами передачи - в данном случае будем использовать оповещения по email и telegram.
Подготовка данных для получения алертов по Email
Для почты нам необходимо определиться с smtp-сервером (в нашем случае будем использовать сервис yandex) и получить логин и пароль для подключения:
Зайдем в свой yandex-аккаунт, перейдем во вкладку «Security»
![](https://habrastorage.org/getpro/habr/upload_files/e61/90f/488/e6190f488ee2f4ad103b2d17151ed4bc.png)
В блоке «Access to your data» выберем пункт «App passwords»:
![](https://habrastorage.org/getpro/habr/upload_files/6eb/8c6/889/6eb8c6889696643527ff23320b198e20.png)
В блоке «Create an app password» выберем пункт «Email address»:
![](https://habrastorage.org/getpro/habr/upload_files/afa/1c2/ec8/afa1c2ec8cc01e200124ff2e8887f171.png)
Далее система попросим ввести имя сервиса и сгенерирует пароль.
Логином является название учетной записи в Yandex.
Полученные значения внесем в конфигурационный файл «/etc/prometheus/alertmanager.yml» в блок «receivers»:
receivers:
- name: 'nikolay'
email_configs:
- to: 'justnikobird@yandex.ru'
from: 'justnikobird@yandex.ru'
smarthost: 'smtp.yandex.ru:587'
auth_username: 'justnikobird'
auth_identity: 'justnikobird'
auth_password: '***'
Подготовка данных для получения алертов в Telegram
Для получения оповещений в Telegram нам необходимо создать своего бота и скопировать его токен:
![](https://habrastorage.org/getpro/habr/upload_files/7e9/fb6/ee0/7e9fb6ee0d32d382e9c4ec37f21980d6.png)
Также необходимо узнать свой chat-id:
![](https://habrastorage.org/getpro/habr/upload_files/937/912/c6b/937912c6b1c616d0f82654b3da03f258.png)
Полученные значения внесем в конфигурационный файл «/etc/prometheus/alertmanager.yml» в блок «receivers»:
telegram_configs:
- bot_token: '6941051793:AAFcw9nzSuzs718vgMSa9JR02gNOy3aYSyQ'
chat_id: ***
Конфигурационный файл Alertmanager целиком
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'nikolay'
receivers:
- name: 'nikolay'
email_configs:
- to: 'justnikobird@yandex.ru'
from: 'justnikobird@yandex.ru'
smarthost: 'smtp.yandex.ru:587'
auth_username: 'justnikobird'
auth_identity: 'justnikobird'
auth_password: '***'
telegram_configs:
- bot_token: '6622906782:AAENZl4MCCp0DtzK6XIVqA9q0kp0BtaYC5I'
chat_id: ***
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
Настройка systemd unit
От имени пользователя «root» cоздадим systemd-юнит «/etc/systemd/system/prometheus-alertmanager.service» для запуска AlertManager:
[Unit]
Description=Alertmanager Service
After=network.target
[Service]
EnvironmentFile=-/etc/default/alertmanager
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/bin/alertmanager $ARGS --config.file=/etc/prometheus/alertmanager.yml --web.config.file=/etc/prometheus/web.yml --storage.path=/etc/prometheus/alertmanager_data
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
Запустим AlertManager и настроим автоматический запуск:
sudo systemctl daemon-reload
sudo systemctl restart prometheus-alertmanager.service
sudo systemctl enable prometheus-alertmanager.service
Сервис прослушивает порт 9093.
Настройка iptables
Выполним настройку iptables:
sudo iptables -A INPUT -p tcp --dport 9093 -j ACCEPT -m comment --comment prometheus_alertmanager
sudo iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT -m comment --comment smtp
Сохраним конфигурацию с помощью инструмента iptables-persistent:
sudo apt-get install -y iptables-persistent
sudo service netfilter-persistent save
Теперь можно перейти по ссылке «https://monitor.justnikobird.ru:9093» и убедиться в том, что AlertManager работает корректно.
Настройка триггеров
Для начала в конфигурационном файле «/etc/prometheus/prometheus.yml», в блоке «rule_files» необходимо указать на ранее созданный нами файл «rules.yml», где будут расположены настройки триггеров:
rule_files:
- rules.yml
Конфигурационный файл Prometheus целиком
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: monitor.justnikobird.ru.crt
static_configs:
- targets: ['monitor.justnikobird.ru:9093']
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- rules.yml
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus-monitor'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: monitor.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['monitor.justnikobird.ru:9090']
- job_name: 'node-monitor'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: monitor.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['monitor.justnikobird.ru:9100']
- job_name: 'node-ca'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: ca.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['ca.justnikobird.ru:9100']
- job_name: 'node-vpn'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: vpn.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['vpn.justnikobird.ru:9100']
- job_name: 'node-repo'
scheme: https
basic_auth:
username: admin
password: password
tls_config:
ca_file: repo.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['repo.justnikobird.ru:9100']
- job_name: 'openvpn'
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['vpn.justnikobird.ru:9176']
- job_name: 'nginx-repo'
scheme: https
tls_config:
ca_file: repo.justnikobird.ru.crt
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['repo.justnikobird.ru:9113']
Для начала подготовим PromQL-выражения, которые мы будем использовать для настройки алертов:
PromQL-выражение | Описание алерта |
Мониторинг Linux на примере vm «ca» | |
((node_filesystem_avail_bytes{job="node-ca", mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{job="node-ca", mountpoint="/",fstype!="rootfs"}) * 100) < 10 | Свободного места на диске < 10% |
((node_memory_MemAvailable_bytes{job="node-ca"} / node_memory_MemTotal_bytes{job="node-ca"}) * 100) < 10 | Свободной оперативной памяти < 10% |
node_load1{job="node-ca"} > 0.9 | loadaverage за минуту > 0.9 |
(rate(node_network_receive_bytes_total{job="node-ca", device="eth0"}[5m]) / 1024 / 1024) > 150 | Входящая нагрузка на порт > 150 Mb/s |
(rate(node_network_transmit_bytes_total{job="node-ca", device="eth0"}[5m]) / 1024 / 1024) > 150 | Входящая нагрузка на порт > 150 Mb/s |
Мониторинг OpenVPN | |
openvpn_up == 0 | Процесс сервиса в статусе down |
openvpn_server_connected_clients == 0 | Количество подключенных клиентов == 0 |
Мониторинг Nginx | |
nginx_up == 0 | Процесс сервиса в статусе down |
nginx_connections_active == 0 | Количество активных сессий == 0 |
Теперь выполним настройку в файле «/etc/prometheus/rules.yml»:
rules.yml
groups:
- name: ca
rules:
- alert: CA_node_exporter_down
expr: up{job="node-ca"} == 0
for: 10s
annotations:
title: 'CA Node Exporter Down'
description: 'CA Node Exporter Down'
labels:
severity: 'crit'
- alert: CA_High_CPU_utiluzation
expr: node_load1{job="node-ca"} > 0.9
for: 1m
annotations:
title: 'High CPU utiluzation'
description: 'High CPU utiluzation'
labels:
severity: 'crit'
- alert: CA_High_memory_utiluzation
expr: ((node_memory_MemAvailable_bytes{job="node-ca"} / node_memory_MemTotal_bytes{job="node-ca"}) * 100) < 10
for: 1m
annotations:
title: 'High memory utiluzation'
description: 'High memory utiluzation'
labels:
severity: 'crit'
- alert: CA_Disc_space_problem
expr: ((node_filesystem_avail_bytes{job="node-ca", mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{job="node-ca", mountpoint="/",fstype!="rootfs"}) * 100) < 10
for: 10m
annotations:
title: 'Disk 90% full'
description: 'Disk 90% full'
labels:
severity: 'crit'
- alert: CA_High_port_incoming_utilization
expr: (rate(node_network_receive_bytes_total{job="node-ca", device="eth0"}[5m]) / 1024 / 1024) > 150
for: 5s
annotations:
title: 'High port input load'
description: 'Incoming port load > 150 Mb/s'
labels:
severity: 'crit'
- alert: CA_High_port_outcoming_utilization
expr: (rate(node_network_transmit_bytes_total{ job="node-ca", device="eth0"}[5m]) / 1024 / 1024) > 150
for: 5s
annotations:
title: High outbound port utilization
description: 'Outcoming port load > 150 Mb/s'
labels:
severity: 'crit'
- name: vpn
rules:
- alert: Vpn_node_exporter_down
expr: up{job="node-vpn"} == 0
for: 10s
annotations:
title: 'Vpn Node Exporter Down'
description: 'Vpn Node Exporter Down'
labels:
severity: 'crit'
- alert: Vpn_exporter_down
expr: up{job="openvpn"} == 0
for: 10s
annotations:
title: 'Vpn Exporter Down'
description: 'Vpn Exporter Down'
labels:
severity: 'crit'
- alert: VpnDown
expr: openvpn_up == 0
for: 10s
annotations:
title: 'VPN Service down'
description: 'VPN Service down'
labels:
severity: 'crit'
- alert: Vpn_NoClientConnected
expr: openvpn_server_connected_clients == 0
for: 10s
annotations:
title: 'No Client Connected'
description: 'No Client Connected'
labels:
severity: 'crit'
- alert: Vpn_High_CPU_utiluzation
expr: node_load1{job="node-vpn"} > 0.9
for: 1m
annotations:
title: 'High CPU utiluzation'
description: 'High CPU utiluzation'
labels:
severity: 'crit'
- alert: Vpn_High_memory_utiluzation
expr: ((node_memory_MemAvailable_bytes{job="node-vpn"} / node_memory_MemTotal_bytes{job="node-vpn"}) * 100) < 10
for: 1m
annotations:
title: 'High memory utiluzation'
description: 'High memory utiluzation'
labels:
severity: 'crit'
- alert: Vpn_Disc_space_problem
expr: ((node_filesystem_avail_bytes{job="node-vpn", mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{job="node-vpn", mountpoint="/",fstype!="rootfs"}) * 100) < 10
for: 10m
annotations:
title: 'Disk 90% full'
description: 'Disk 90% full'
labels:
severity: 'crit'
- alert: Vpn_High_port_incoming_utilization
expr: (rate(node_network_receive_bytes_total{job="node-vpn", device="eth0"}[5m]) / 1024 / 1024) > 150
for: 5s
annotations:
title: 'High port input load'
description: 'Incoming port load > 150 Mb/s'
labels:
severity: 'crit'
- alert: Vpn_High_port_outcoming_utilization
expr: (rate(node_network_transmit_bytes_total{ job="node-vpn", device="eth0"}[5m]) / 1024 / 1024) > 150
for: 5s
annotations:
title: High outbound port utilization
description: 'Outcoming port load > 150 Mb/s'
labels:
severity: 'crit'
- name: monitor
rules:
- alert: Monitor_node_exporter_down
expr: up{job="node-monitor"} == 0
for: 10s
annotations:
title: 'Monitor Node Exporter Down'
description: 'Monitor Node Exporter Down'
labels:
severity: 'crit'
- alert: Monitor_prometheus_exporter_down
expr: up{job="prometheus-monitor"} == 0
for: 10s
annotations:
title: 'Monitor Node Exporter Down'
description: 'Monitor Node Exporter Down'
labels:
severity: 'crit'
- alert: Monitor_High_CPU_utiluzation
expr: node_load1{job="node-monitor"} > 0.9
for: 1m
annotations:
title: 'High CPU utiluzation'
description: 'High CPU utiluzation'
labels:
severity: 'crit'
- alert: Monitor_High_memory_utiluzation
expr: ((node_memory_MemAvailable_bytes{job="node-monitor"} / node_memory_MemTotal_bytes{job="node-monitor"}) * 100) < 10
for: 1m
annotations:
title: 'High memory utiluzation'
description: 'High memory utiluzation'
labels:
severity: 'crit'
- alert: Monitor_Disc_space_problem
expr: ((node_filesystem_avail_bytes{job="node-monitor", mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{job="node-monitor", mountpoint="/",fstype!="rootfs"}) * 100) < 10
for: 10m
annotations:
title: 'Disk 90% full'
description: 'Disk 90% full'
labels:
severity: 'crit'
- alert: Monitor_High_port_incoming_utilization
expr: (rate(node_network_receive_bytes_total{job="node-monitor", device="eth0"}[5m]) / 1024 / 1024) > 150
for: 5s
annotations:
title: 'High port input load'
description: 'Incoming port load > 150 Mb/s'
labels:
severity: 'crit'
- alert: Monitor_High_port_outcoming_utilization
expr: (rate(node_network_transmit_bytes_total{ job="node-monitor", device="eth0"}[5m]) / 1024 / 1024) > 150
for: 5s
annotations:
title: High outbound port utilization
description: 'Outcoming port load > 150 Mb/s'
labels:
severity: 'crit'
- name: repo
rules:
- alert: Repo_node_exporter_down
expr: up{job="node-repo"} == 0
for: 10s
annotations:
title: 'Repo Node Exporter Down'
description: 'Repo Node Exporter Down'
labels:
severity: 'crit'
- alert: Repo_nginx_exporter_down
expr: up{job="nginx-repo"} == 0
for: 10s
annotations:
title: 'Repo Nginx Exporter Down'
description: 'Repo Nginx Exporter Down'
labels:
severity: 'crit'
- alert: Repo_NginxDown
expr: nginx_up == 0
for: 10s
annotations:
title: 'Nginx Service down'
description: 'Nginx Service down'
labels:
severity: 'crit'
- alert: Repo_NoActiveClientConnections
expr: nginx_connections_active == 1
for: 10s
annotations:
title: 'No active connections'
description: 'No active connections except nginx exporter'
labels:
severity: 'crit'
- alert: Repo_NoActiveConnections
expr: nginx_connections_active == 0
for: 10s
annotations:
title: 'No active connections'
description: 'No active connections'
labels:
severity: 'crit'
- alert: Repo_High_CPU_utiluzation
expr: node_load1{job="node-repo"} > 0.9
for: 1m
annotations:
title: 'High CPU utiluzation'
description: 'High CPU utiluzation'
labels:
severity: 'crit'
- alert: Repo_High_memory_utiluzation
expr: ((node_memory_MemAvailable_bytes{job="node-repo"} / node_memory_MemTotal_bytes{job="node-repo"}) * 100) < 10
for: 1m
annotations:
title: 'High memory utiluzation'
description: 'High memory utiluzation'
labels:
severity: 'crit'
- alert: Repo_Disc_space_problem
expr: ((node_filesystem_avail_bytes{job="node-repo", mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{job="node-repo", mountpoint="/",fstype!="rootfs"}) * 100) < 10
for: 10m
annotations:
title: 'Disk 90% full'
description: 'Disk 90% full'
labels:
severity: 'crit'
- alert: Repo_High_port_incoming_utilization
expr: (rate(node_network_receive_bytes_total{job="node-repo", device="eth0"}[5m]) / 1024 / 1024) > 150
for: 5s
annotations:
title: 'High port input load'
description: 'Incoming port load > 150 Mb/s'
labels:
severity: 'crit'
- alert: Repo_High_port_outcoming_utilization
expr: (rate(node_network_transmit_bytes_total{ job="node-repo", device="eth0"}[5m]) / 1024 / 1024) > 150
for: 5s
annotations:
title: High outbound port utilization
description: 'Outcoming port load > 150 Mb/s'
labels:
severity: 'crit'
Выполним проверку правил с помощью инструмента «promtool»:
sudo promtool check rules /etc/prometheus/rules.yml
Если проверка пройдена успешно, то можно двигаться дальше.
Перезагрузим AlertManager и Prometheus:
sudo systemctl restart prometheus-alertmanager.service
sudo systemctl restart prometheus.service
В случае успешной конфигурации, в web-интерфейсе Prometheus в разделе «Alerts» мы увидим следующий вывод:
![](https://habrastorage.org/getpro/habr/upload_files/dbe/ee3/ac7/dbeee3ac748f844dd5a946a95ca36b99.png)
![](https://habrastorage.org/getpro/habr/upload_files/7ac/54c/c2c/7ac54cc2cfa813586941a07a2b32254d.png)
Уведомления от AlertManager выглядят следующим образом:
![Уведомления в Telegram Уведомления в Telegram](https://habrastorage.org/getpro/habr/upload_files/80e/e02/dab/80ee02dab604778680d81e89d7ccf931.png)
![Уведомление по Email Уведомление по Email](https://habrastorage.org/getpro/habr/upload_files/284/7cb/de5/2847cbde5decd3d8065a9700687509b6.png)
Сборка deb-пакета Prometheus с AlertManager
Весь процесс сборки я описал в статье «Работа с DEB-пакетами».
Здесь я только помечу следующие данные для сборки:
Файлы, которые будем хранить в пакете:
/etc/prometheus/alertmanager.yml
/etc/prometheus/console_libraries/
/etc/prometheus/consoles/
/etc/prometheus/prometheus.yml
/etc/prometheus/rules.yml
/etc/prometheus/web.yml
/usr/bin/prometheus
/usr/bin/promtool
/usr/bin/alertmanager
/usr/bin/amtool
/etc/systemd/system/prometheus.service
/etc/systemd/system/prometheus-alertmanager.service
install
alertmanager.yml etc/prometheus
console_libraries/ etc/prometheusi
consoles/ etc/prometheus
prometheus.yml etc/prometheus
rules.yml etc/prometheus
web.yml etc/prometheus
prometheus usr/bin
promtool usr/bin
alertmanager usr/bin
amtool usr/bin
prometheus.service etc/systemd/system
prometheus-alertmanager.service etc/systemd/system
control
Source: prometheus-lab
Section: unknown
Priority: optional
Maintainer: Nikolay <justnikobird@yandex.ru>
Build-Depends: debhelper-compat (= 13)
Standards-Version: 4.6.0
Homepage: <insert the upstream URL, if relevant>
#Vcs-Browser: https://salsa.debian.org/debian/just-prometheus
#Vcs-Git: https://salsa.debian.org/debian/just-prometheus.git
Rules-Requires-Root: no
Package: prometheus-lab
Architecture: all
Depends: ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
postinst
#!/bin/sh
set -e
USER="prometheus"
GROUP="prometheus"
if ! getent group "$GROUP" > /dev/null 2>&1 ; then
addgroup --system "$GROUP" --quiet
fi
if ! id "$USER" > /dev/null 2>&1 ; then
adduser --system --home /usr/share/prometheus --no-create-home \
--ingroup "$GROUP" --disabled-password --shell /bin/false \
"$USER"
fi
if [ ! -d "/var/lib/prometheus/" ]; then
mkdir /var/lib/prometheus/
chown -R $USER:$GROUP /var/lib/prometheus/
chmod -R 755 /var/lib/prometheus/
fi
if [ ! -d "/etc/prometheus/alertmanager_data/" ]; then
mkdir /etc/prometheus/alertmanager_data/
chown -R $USER:$GROUP /etc/prometheus/alertmanager_data/
chmod -R 755 /etc/prometheus/alertmanager_data/
fi
chown -R $USER:$GROUP /etc/prometheus/
chmod -R 755 /etc/prometheus/
chown $USER:$GROUP /usr/bin/prometheus
chmod 755 /usr/bin/prometheus
chown $USER:$GROUP /usr/bin/promtool
chmod 755 /usr/bin/promtool
chown $USER:$GROUP /usr/bin/alertmanager
chmod 755 /usr/bin/alertmanager
chown $USER:$GROUP /usr/bin/amtool
chmod 755 /usr/bin/amtool
ln -s /usr/bin/prometheus /usr/local/bin/prometheus
chown -h prometheus:prometheus /usr/local/bin/prometheus
ln -s /usr/bin/promtool /usr/local/bin/promtool
chown -h prometheus:prometheus /usr/local/bin/promtool
ln -s /usr/bin/alertmanager /usr/local/bin/alertmanager
chown -h prometheus:prometheus /usr/local/bin/alertmanager
ln -s /usr/bin/amtool /usr/local/bin/amtool
chown -h prometheus:prometheus /usr/local/bin/amtool
echo -n "Restarting prometheus-server service..."
if command -v systemctl >/dev/null; then
systemctl daemon-reload
systemctl restart prometheus.service || true
systemctl restart prometheus-alertmanager.service || true
fi
echo " OK"
prerm
#!/bin/sh
echo 'Stopping and disabling prometheus-server service...'
if command -v systemctl >/dev/null; then
systemctl stop prometheus.service || true
systemctl disable prometheus.service || true
systemctl stop prometheus-alertmanager.service || true
systemctl disable prometheus-alertmanager.service || true
fi
userdel prometheus >/dev/null 2>&1 || true
groupdel prometheus >/dev/null 2>&1 || true
if [ -d "/var/lib/prometheus/" ]; then
rm -rf /var/lib/prometheus/
fi
if [ -d "/etc/prometheus/alertmanager_data/" ]; then
rm -rf /etc/prometheus/alertmanager_data/
fi
unlink /usr/local/bin/prometheus 2>&1 || true
unlink /usr/local/bin/promtool 2>&1 || true
unlink /usr/local/bin/alertmanager 2>&1 || true
unlink /usr/local/bin/amtool 2>&1 || true
echo " OK"
В результате мы собрали пакет «prometheus-lab_0.1-1_all.deb».
Далее загрузим новый пакет в локальный репозиторий.
Bash-скрипт для Prometheus и AlertManager
Настало время написать bash-скрипт, который сможет выполнить настройку Prometheus и AlertManager автоматически:
prometheus.sh
#!/bin/bash
# активируем опцию, которая прерывает выполнение скрипта, если любая команда завершается с ненулевым статусом
set -e
# проверим, запущен ли скрипт от пользователя root
if [[ "${UID}" -ne 0 ]]; then
echo -e "You need to run this script as root!"
exit 1
fi
# проверим подключен ли репозиторий
if [[ ! $(grep -rhE ^deb /etc/apt/sources.list*) == *"deb https://repo.justnikobird.ru:1111/lab focal main"* ]]; then
echo -e "Lab repo not connected!\nPlease run vm_start.sh script!\n"
exit 1
fi
# функция, которая проверяет наличие пакета в системе и в случае его отсутствия выполняет установку
command_check() {
if ! command -v "$1" &>/dev/null; then
echo -e "\n====================\n$2 could not be found!\nInstalling...\n====================\n"
apt-get install -y "$3"
echo -e "\nDONE\n"
fi
}
# функция, которая проверяет наличие правила в iptables и в случае отсутствия применяет его
iptables_add() {
if ! iptables -C "$@" &>/dev/null; then
iptables -A "$@"
fi
}
# функция, которая проверяет валидность пути в linux-системе
path_request() {
while true; do
read -r -e -p $'\n'"Please input valid path to ${1}: " path
if [ -f "$path" ]; then
echo "$path"
break
fi
done
}
# установим все необходимые пакеты используя функцию command_check
systemctl restart systemd-timesyncd.service
apt-get update
command_check iptables "Iptables" iptables
command_check netfilter-persistent "Netfilter-persistent" iptables-persistent
command_check prometheus "Prometheus" prometheus-lab
command_check basename "Basename" coreutils
command_check htpasswd "Htpasswd" apache2-utils
# запросим адрес приватной сети и проверим его на корректность
while true; do
read -r -p $'\n'"Privat network (format 10.0.0.0/24): " private_net
if [[ ! $private_net =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$ ]]; then
echo -e "\nPrefix not valid!\n"
else
break
fi
done
# выполним настройку iptables
echo -e "\n====================\nIptables configuration\n====================\n"
iptables_add INPUT -p tcp --dport 9090 -j ACCEPT -m comment --comment prometheus
iptables_add INPUT -p tcp --dport 9093 -j ACCEPT -m comment --comment prometheus_alertmanager
iptables_add OUTPUT -p tcp --dport 587 -j ACCEPT -m comment --comment smtp
iptables_add OUTPUT -p tcp -d "$private_net" --dport 9100 -j ACCEPT -m comment --comment prometheus_node_exporter
iptables_add OUTPUT -p tcp -d "$private_net" --dport 9176 -j ACCEPT -m comment --comment prometheus_openvpn_exporter
iptables_add OUTPUT -p tcp -d "$private_net" --dport 9113 -j ACCEPT -m comment --comment prometheus_nginx_exporter
echo -e "\n====================\nSaving iptables config\n====================\n"
service netfilter-persistent save
echo -e "\nDONE\n"
# выполним настройку HTTPS
echo -e "\n====================\nHTTPS configuration\n====================\n"
# запросим путь до файла сертификата, перенесем его в рабочую директорию программы и поменяем владельца
cert_path=$(path_request certificate)
cp "$cert_path" /etc/prometheus/
cert_file=$(basename "$cert_path")
chmod 640 /etc/prometheus/"$cert_file"
chown prometheus:prometheus /etc/prometheus/"$cert_file"
# запросим путь до файла ключа, перенесем его в рабочую директорию программы и поменяем владельца
key_path=$(path_request key)
cp "$key_path" /etc/prometheus/
key_file=$(basename "$key_path")
chmod 640 /etc/prometheus/"$key_file"
chown prometheus:prometheus /etc/prometheus/"$key_file"
# перенесем в директорию prometheus сертификаты экспортеров
while true; do
read -r -n 1 -p $'\n\n'"Add exporter's certificate to prometheus directory? (y|n) " yn
case $yn in
[Yy]*)
echo -e "\n"
exp_cert_path=$(path_request certificate)
cp "$exp_cert_path" /etc/prometheus/
exp_cert_file=$(basename "$exp_cert_path")
chmod 640 /etc/prometheus/"$exp_cert_file"
chown prometheus:prometheus /etc/prometheus/"$exp_cert_file"
;;
[Nn]*)
echo -e "\n"
break
;;
*) echo -e "\nPlease answer Y or N!\n" ;;
esac
done
# запросим username и password для авторизации в программе
read -r -p $'\n'"Prometheus username: " username
read -r -p $'\n'"Prometheus password: " -s password
# запросим доменное имя для подключения prometheus к alertmanager
read -r -p $'\n\n'"Prometheus domain name (format monitor.justnikobird.ru): " domain_name
# запишем настройки в конфигурационный файл /etc/prometheus/web.yml
echo -e "tls_server_config:\n cert_file: $cert_file\n key_file: $key_file\n\nbasic_auth_users:\n $username: '$(htpasswd -nbB -C 10 admin "$password" | grep -o "\$.*")'" >/etc/prometheus/web.yml
# внесем изменения в конфигурационный файл /etc/prometheus/prometheus.yml в блок alerting
sed -r -i '0,/(^.*\susername:\s).*$/s//\1'"$username"'/' /etc/prometheus/prometheus.yml
sed -r -i '0,/(^.*\spassword:\s).*$/s//\1'"$password"'/' /etc/prometheus/prometheus.yml
sed -r -i '0,/(^.*\sca_file:\s).*$/s//\1'"$cert_file"'/' /etc/prometheus/prometheus.yml
sed -r -i "0,/(^.*\stargets:\s).*/s//\1['$domain_name:9093']/" /etc/prometheus/prometheus.yml
# выполним настройку DNS
echo -e "\n\n====================\nDNS configuration\n====================\n"
# закрепим доменное имя prometheus за адресом localhost
if ! grep -Fxq "127.0.0.1 $domain_name" /etc/hosts &>/dev/null; then
echo "127.0.0.1 $domain_name" >>/etc/hosts
echo -e "\nString '127.0.0.1 $domain_name' added to /etc/hosts\n\n"
fi
echo -e "/etc/hosts file content:\n\n"
cat /etc/hosts
# запросим у пользователя строки для добавления в /etc/hosts
while true; do
read -r -n 1 -p $'\n\n'"Add new string to /etc/hosts? (y|n) " yn
case $yn in
[Yy]*)
while true; do
read -r -p $'\n\n'"Enter string in format '<ip> <domain>': " domain_str
if [[ $domain_str =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}[[:blank:]][a-z\.]+$ ]]; then
echo "$domain_str" >>/etc/hosts
echo -e "\n\n/etc/hosts file content:\n\n"
cat /etc/hosts
break
else
echo -e "\nWrong string format!\n"
fi
done
;;
[Nn]*)
echo -e "\n"
break
;;
*) echo -e "\nPlease answer Y or N!\n" ;;
esac
done
# перезагрузим сервисы prometheus и alertmanager
echo -e "\nDONE\n"
systemctl daemon-reload
systemctl restart prometheus.service
systemctl enable prometheus.service
systemctl restart prometheus-alertmanager.service
systemctl enable prometheus-alertmanager.service
echo -e "\n====================\nPrometheus listening on port 9090\nAlertmanager listening on port 9093\n====================\n"
echo -e "\nOK\n"
exit 0
Замечу, что в данном скрипте не реализован функционал настройки подключений Prometheus к экспортерам, так как интерактивный режим только усложнит и замедлит настройку.
Настройка Grafana
Зайдем на vm «monitor», скачаем установочный пакет Grafana версии 10.1.1 с официального сайта разработчика (на момент написания статьи, в России доступ к файлам заблокирован, поэтому его можно скачать через VPN) и выполним установку:
wget -P ~/ https://dl.grafana.com/enterprise/release/grafana-enterprise_10.1.1_amd64.deb
sudo apt-get install -y ~/grafana-enterprise_10.1.1_amd64.deb
Заметка
В других версиях Grafana процесс и особенности настройки могут отличаться от описанных в данной статье.
Настройка HTTPS
Скопируем ранее подписанную пару ключей из директории Prometheus в директорию Grafana и изменим права на владение:
sudo cp /etc/prometheus/monitor.justnikobird.ru.crt /etc/grafana/
sudo cp /etc/prometheus/monitor.justnikobird.ru.key /etc/grafana/
sudo chown root:grafana /etc/grafana/monitor.justnikobird.ru.*
sudo chmod 640 /etc/grafana/monitor.justnikobird.ru.*
Выполним настройку https в конфигурационном файле «/etc/grafana/grafana.ini» в блоке «server»:
[server]
protocol = https
domain = monitor.justnikobird.ru
cert_file = /etc/grafana/monitor.justnikobird.ru.crt
cert_key = /etc/grafana/monitor.justnikobird.ru.key
Запустим Grafana и настроим автоматический запуск:
sudo systemctl daemon-reload
sudo systemctl restart grafana-server.service
sudo systemctl enable grafana-server.service
Cервис прослушивает порт 3000.
Настройка iptables
Выполним настройку iptables:
sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT -m comment --comment grafana
Сохраним конфигурацию с помощью пакета iptables-persistent:
sudo apt-get install -y iptables-persistent
sudo service netfilter-persistent save
Теперь можно перейти по ссылке «https://monitor.justnikobird.ru:3000» и убедиться в том, что Grafana работает корректно.
Логин и пароль по умолчанию «admin».
Подключение Prometheus к Grafana
Перейдем во вкладку «Connections», затем «Data sources»:
![](https://habrastorage.org/getpro/habr/upload_files/fc4/5b0/908/fc45b09086d520435b7653c211e47062.png)
Нажмем кнопку «Add data source», выберем «Prometheus» и заполним поля для подключения:
![](https://habrastorage.org/getpro/habr/upload_files/a88/e79/748/a88e79748154f5a9f531a1765f9ab6c0.png)
Настройка dashboard
Данную процедуру решил не описывать, но результат у меня получился следующий:
![](https://habrastorage.org/getpro/habr/upload_files/9bf/3dd/46c/9bf3dd46c5690341e45078d4f311c374.png)
Загрузка deb-пакета Grafana в локальный репозиторий
Поскольку пакет Grafana можно скачать только через VPN, то пересоберем пакет «grafana-enterprise_10.1.1_amd64.deb» и сменим его название на «grafana-lab»:
Процесс пересборки пакета описан в статье «Работа с DEB-пакетами».
В результате мы получили пакет «grafana-lab_10.1.1_amd64.deb»
Далее загрузим новый пакет в локальный репозиторий.
Bash-скрипт для Grafana
Настало время написать bash-скрипт, который сможет выполнить настройку Grafana автоматически:
grafana.sh
#!/bin/bash
# активируем опцию, которая прерывает выполнение скрипта, если любая команда завершается с ненулевым статусом
set -e
# проверим, запущен ли скрипт от пользователя root
if [[ "${UID}" -ne 0 ]]; then
echo -e "You need to run this script as root!"
exit 1
fi
# проверим подключен ли репозиторий
if [[ ! $(grep -rhE ^deb /etc/apt/sources.list*) == *"deb https://repo.justnikobird.ru:1111/lab focal main"* ]]; then
echo -e "Lab repo not connected!\nPlease run vm_start.sh script!\n"
exit 1
fi
# функция, которая проверяет наличие пакета в системе и в случае его отсутствия выполняет установку
command_check() {
if ! command -v "$1" &>/dev/null; then
echo -e "\n====================\n$2 could not be found!\nInstalling...\n====================\n"
apt-get install -y "$3"
echo -e "\nDONE\n"
fi
}
# функция, которая проверяет наличие правила в iptables и в случае отсутствия применяет его
iptables_add() {
if ! iptables -C "$@" &>/dev/null; then
iptables -A "$@"
fi
}
# функция, которая проверяет валидность пути в linux-системе
path_request() {
while true; do
read -r -e -p $'\n'"Please input valid path to ${1}: " path
if [ -f "$path" ]; then
echo "$path"
break
fi
done
}
# установим все необходимые пакеты используя функцию command_check
systemctl restart systemd-timesyncd.service
apt-get update
command_check iptables "Iptables" iptables
command_check netfilter-persistent "Netfilter-persistent" iptables-persistent
command_check basename "Basename" coreutils
command_check grafana-server "Grafana" grafana-lab
# настроим iptables
echo -e "\n====================\nIptables configuration\n====================\n"
iptables_add INPUT -p tcp --dport 3000 -j ACCEPT -m comment --comment grafana
echo -e "\n====================\nSaving iptables config\n====================\n"
service netfilter-persistent save
echo -e "\nDONE\n"
# настроим https
echo -e "\n====================\nHTTPS configuration\n====================\n"
# запросим путь до сертификата и перенесем его в рабочую директорию программы
cert_path=$(path_request certificate)
cp "$cert_path" /etc/grafana/
# отделим название файла от пути и поменяем права на доступ
cert_file=$(basename "$cert_path")
chmod 640 /etc/grafana/"$cert_file"
chown root:grafana /etc/grafana/"$cert_file"
# запросим путь до ключа и перенесем его в рабочую директорию программы
key_path=$(path_request key)
cp "$key_path" /etc/grafana/
# отделим название файла от пути и поменяем права на доступ
key_file=$(basename "$key_path")
chmod 640 /etc/grafana/"$key_file"
chown root:grafana /etc/grafana/"$key_file"
# запросим доменное имя
read -r -e -p $'\n'"Please input domain name (example: monitor.justnikobird.ru): " domain
# внесем настройки в конфигурационный файл grafana
sed -i 's/^\;\(protocol\).*$/\1 = https/' /etc/grafana/grafana.ini
sed -i 's/^\;\(domain\).*$/\1 = '"$domain"'/' /etc/grafana/grafana.ini
sed -i 's@^\;\(cert_file\).*$@\1 = /etc/grafana/'"$cert_file"'@' /etc/grafana/grafana.ini
sed -i 's@^\;\(cert_key\).*$@\1 = /etc/grafana/'"$key_file"'@' /etc/grafana/grafana.ini
echo -e "\nDONE\n"
# перезагрузим сервис grafana
systemctl daemon-reload
systemctl restart grafana-server.service
systemctl enable grafana-server.service
echo -e "\n====================\nGrafana listening on port 3000\n====================\n"
echo -e "\nOK\n"
exit 0
Также если вам интересна работа с генераторами трафика, то предлагаю ознакомиться с моей статьей «Cisco TRex на практике».