
В данной серии статей описан процесс создания первого 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
От имени пользователя «root» создадим systemd-юнит «/etc/systemd/system/prometheus.service» для запуска Prometheus: Запустим Prometheus и настроим автоматический запуск: Сервис Prometheus прослушивает порт 9090. Выполним настройку iptables: Сохраним конфигурацию с помощью инструмента iptables-persistent: Теперь можно перейти по ссылке «https://monitor.justnikobird.ru:9090» и убедиться в том, что Prometheus работает корректно. Экспортеры Prometheus предоставляют механизм сбора метрик из различных источников и преобразования их в формат, который может быть понятен Prometheus. Это позволяет Prometheus собирать данные из различных систем, даже если они не предоставляют нативную поддержку для этого инструмента мониторинга. Node Exporter — это инструмент для сбора метрик с узлов операционных систем, который позволяет выполнять мониторинг различных характеристик узлов, таких как использования CPU, памяти, сетевой активности и других ресурсов. Данный экспортер мы установим на все vm стенда. Зайдем на vm и скачаем исходные файлы Node Exporter версии 1.6.1 c официальной страницы разработчиков на GitHub в домашнюю директорию и выполним ручную установку: В других версиях Node Exporter процесс и особенности настройки могут отличаться от описанных в данной статье. Поместим ранее подписанную пару ключей для vm в рабочую директорию экспортера: Подготовим хэш пароля для нового пользователя — скачаем необходимый пакет с инструментами и сгенерируем пароль «password» для пользователя «admin»: В результате выполнения команды мы получим следующую строку: Создадим файл «/opt/node_exporter/web.yml», куда внесем настройки https: Создадим техническую учетную запись и группу «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/
От имени пользователя «root» создадим systemd-юнит «/etc/systemd/system/node_exporter.service» для запуска Node Exporter: Запустим Node Exporter и настроим автоматический запуск: Сервис прослушивает порт 9100 Выполним настройку iptables для подключения к экспортеру сервера Prometheus из приватной сети с адресом «10.0.0.6»: Приватный адрес сервера Prometheus может отличаться от настроенного в данном стенде. Сохраним конфигурацию с помощью инструмента iptables-persistent: Весь процесс сборки я описал в статье «Работа с DEB-пакетами». Здесь я только помечу следующие данные для сборки: Файлы, которое буем хранить в пакете: В результате мы собрали пакет «node-exporter-lab_0.1-1_all.deb». Далее загрузим новый пакет в локальный репозиторий. OpenVPN Exporter — предоставлять Prometheus метрики и статистику, связанные с OpenVPN. Экспортер позволяет выполнять мониторинг информации о текущих соединениях, загрузке сервера, статистике использования ресурсов и другие параметры, которые могут быть полезными для анализа и управления инфраструктурой OpenVPN. Зайдем на vm «vpn» и установим интерпретатор языка Go: Скачаем исходные файлы OpenVPN Exporter версии 0.3.0 c официальной страницы разработчиков на GitHub в домашнюю директорию и выполним ручную установку: В других версиях OpenVPN Exporter процесс и особенности настройки могут отличаться от описанных в данной статье. В переменной «openvpnStatusPaths» конфигурационного файла «~/openvpn_exporter-0.3.0/main.go» укажем путь до лог-фала OpenVPN: Соберем программу из исходников: В результате сборки мы получили бинарный файл «main», который необходимо переименовать и переместить в директорию «/usr/bin»: Создадим техническую учетную запись и группу «openvpn_exporter» для повышения безопасности работы программы: Добавим в новую группу «openvpn_exporter» пользователя «root»: Теперь изменим права на владение лог-файлом OpenVPN: Выдадим права sudo chown openvpn_exporter:openvpn_exporter /usr/bin/openvpn_exporter sudo chmod 755 /usr/bin/openvpn_exporter
От имени пользователя «root» создадим systemd-юнит «/etc/systemd/system/openvpn_exporter.service» для запуска OpenVPN Exporter: Запустим OpenVPN Exporter и настроим автоматический запуск: Сервис прослушивает порт 9176 по протоколу http. Выполним настройку iptables для подключения к экспортеру сервера Prometheus из приватной сети с адресом «10.0.0.6»: Приватный адрес сервера Prometheus может отличаться от настроенного в данном стенде. Сохраним конфигурацию с помощью инструмента iptables-persistent: Весь процесс сборки я описал в статье «Работа с DEB-пакетами». Здесь я только помечу следующие данные для сборки: Файлы, которое буем хранить в пакете: В результате мы собрали пакет «openvpn-exporter-lab_0.1-1_all.deb». Далее загрузим новый пакет в локальный репозиторий. Nginx Exporter собирает различные метрики, такие как количество запросов, статусы запросов, использование ресурсов, и другие характеристики производительности веб-сервера Nginx. Зайдем на vm «repo» и скачаем исходные файлы Nginx Exporter версии 0.11.0 c официальной страницы разработчиков на GitHub в домашнюю директорию и выполним ручную установку: В других версиях Nginx Exporter процесс и особенности настройки могут отличаться от описанных в данной статье. Важно заметить, что для работы экспортера необходимо включить сервис отображения метрик в Nginx. В конфигурационном файле Nginx должны присутствовать следующие строки: Поместим ранее подписанную пару ключей в рабочую директорию экспортера: Создадим файл «/opt/nginx_exporter/prometheus-nginx-exporter», куда внесем настройки https: Создадим техническую учетную запись и группу «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
От имени пользователя «root» создадим systemd-юнит «/etc/systemd/system/nginx_exporter.service» для запуска Nginx Exporter: Запустим Nginx Exporter и настроим автоматический запуск: Сервис прослушивает порт 9113 Выполним настройку iptables для подключения к экспортеру сервера Prometheus из приватной сети с адресом «10.0.0.6»: Приватный адрес сервера Prometheus может отличаться от настроенного в данном стенде. Сохраним конфигурацию с помощью инструмента iptables-persistent: Весь процесс сборки я описал в статье «Работа с DEB-пакетами». Здесь я только помечу следующие данные для сборки: Файлы, которое буем хранить в пакете: В результате мы собрали пакет «nginx-exporter-lab_0.1-1_all.deb». Далее загрузим новый пакет в локальный репозиторий. Настало время написать bash-скрипт, который сможет выполнить настройку экспортеров автоматически: Зайдем на vm «monitor». Перенесем файлы сертификатов подключаемых экспортеров на vm «monitor» в рабочую директорию «/etc/prometheus»: Для подключения к экспортерам через приватную сеть по доменным именам, выполним настройку DNS в фале «/etc/hosts»: Настройка подключения Prometheus к экспортерам выполняется в конфигурационном файле «/etc/prometheus/prometheus.yml» в блоке «scrape_configs»: Выполним проверку конфигурации Prometheus с помощью инструмента «promtool»: Если проверка пройдена успешно, то можно двигаться дальше. Выполним настройку iptables для возможности получения данных от настроенных экспортеров: Сохраним конфигурацию с помощью инструмента iptables-persistent: Перезагрузим Prometheus: Проверим корректность подключения в AlertManager — это программа, которая получает алерты от Prometheus, обрабатывает их, группирует и формирует оповещения об инцидентах. AlertManager позволяет гибко настроить условия формирования оповещений и может рассылать их по разным каналам: начиная от электронной почты, заканчивая Telegram. Зайдем на vm «monitor» и скачаем исходные файлы AlertManager версии 0.26.0 c официальной страницы разработчиков на GitHub в домашнюю директорию и выполним ручную установку: amtool: Исполняемый файл, который позволяет просматривать или изменять текущее состояние AlertManager. Другими словами, amtool может отключать оповещения, отключать по истечении срока действия, а также импортировать или запрашивать их. Его можно рассматривать как утилиту для настройки AlertManager без непосредственного изменения конфигурации текущих оповещений. alertmanager: Исполняемый файл, который используется для запуска сервиса Alert Manager. alertmanager.yml: Конфигурационный файл AlertManager. Создадим директорию для хранения данных AlertManager: Создадим конфигурационный файл, где будем хранить настройки триггеров: Подключим Prometheus к AlertManager в конфигурационном файле «/etc/prometheus/prometheus.yml» в блоке «alerting»: Выполним проверку конфигурации Prometheus с помощью инструмента «promtool»: Если проверка пройдена успешно, то можно двигаться дальше. AlertManager и Prometheus будут использовать один конфигурационный файл с настройками https, который мы подготовили ранее: Выдадим права ранее созданной 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. Для почты нам необходимо определиться с smtp-сервером (в нашем случае будем использовать сервис yandex) и получить логин и пароль для подключения: Зайдем в свой yandex-аккаунт, перейдем во вкладку «Security» В блоке «Access to your data» выберем пункт «App passwords»: В блоке «Create an app password» выберем пункт «Email address»: Далее система попросим ввести имя сервиса и сгенерирует пароль. Логином является название учетной записи в Yandex. Полученные значения внесем в конфигурационный файл «/etc/prometheus/alertmanager.yml» в блок «receivers»: Для получения оповещений в Telegram нам необходимо создать своего бота и скопировать его токен: Также необходимо узнать свой chat-id: Полученные значения внесем в конфигурационный файл «/etc/prometheus/alertmanager.yml» в блок «receivers»: От имени пользователя «root» cоздадим systemd-юнит «/etc/systemd/system/prometheus-alertmanager.service» для запуска AlertManager: Запустим AlertManager и настроим автоматический запуск: Сервис прослушивает порт 9093. Выполним настройку iptables: Сохраним конфигурацию с помощью инструмента iptables-persistent: Теперь можно перейти по ссылке «https://monitor.justnikobird.ru:9093» и убедиться в том, что AlertManager работает корректно. Для начала в конфигурационном файле «/etc/prometheus/prometheus.yml», в блоке «rule_files» необходимо указать на ранее созданный нами файл «rules.yml», где будут расположены настройки триггеров: Для начала подготовим 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»: Выполним проверку правил с помощью инструмента «promtool»: Если проверка пройдена успешно, то можно двигаться дальше. Перезагрузим AlertManager и Prometheus: В случае успешной конфигурации, в web-интерфейсе Prometheus в разделе «Alerts» мы увидим следующий вывод: Уведомления от AlertManager выглядят следующим образом: Весь процесс сборки я описал в статье «Работа с DEB-пакетами». Здесь я только помечу следующие данные для сборки: Файлы, которые будем хранить в пакете: В результате мы собрали пакет «prometheus-lab_0.1-1_all.deb». Далее загрузим новый пакет в локальный репозиторий. Настало время написать bash-скрипт, который сможет выполнить настройку Prometheus и AlertManager автоматически: Замечу, что в данном скрипте не реализован функционал настройки подключений Prometheus к экспортерам, так как интерактивный режим только усложнит и замедлит настройку. Зайдем на vm «monitor», скачаем установочный пакет Grafana версии 10.1.1 с официального сайта разработчика (на момент написания статьи, в России доступ к файлам заблокирован, поэтому его можно скачать через VPN) и выполним установку: В других версиях Grafana процесс и особенности настройки могут отличаться от описанных в данной статье. Скопируем ранее подписанную пару ключей из директории Prometheus в директорию Grafana и изменим права на владение: Выполним настройку https в конфигурационном файле «/etc/grafana/grafana.ini» в блоке «server»: Запустим Grafana и настроим автоматический запуск: Cервис прослушивает порт 3000. Выполним настройку iptables: Сохраним конфигурацию с помощью пакета iptables-persistent: Теперь можно перейти по ссылке «https://monitor.justnikobird.ru:3000» и убедиться в том, что Grafana работает корректно. Логин и пароль по умолчанию «admin». Перейдем во вкладку «Connections», затем «Data sources»: Нажмем кнопку «Add data source», выберем «Prometheus» и заполним поля для подключения: Данную процедуру решил не описывать, но результат у меня получился следующий: Поскольку пакет Grafana можно скачать только через VPN, то пересоберем пакет «grafana-enterprise_10.1.1_amd64.deb» и сменим его название на «grafana-lab»: Процесс пересборки пакета описан в статье «Работа с DEB-пакетами». В результате мы получили пакет «grafana-lab_10.1.1_amd64.deb» Далее загрузим новый пакет в локальный репозиторий. Настало время написать bash-скрипт, который сможет выполнить настройку Grafana автоматически: Также если вам интересна работа с генераторами трафика, то предлагаю ознакомиться с моей статьей «Cisco TRex на практике». Настройка systemd unit
[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.targetsudo systemctl daemon-reload sudo systemctl restart prometheus.service sudo systemctl enable prometheus.serviceНастройка iptables
sudo iptables -A INPUT -p tcp --dport 9090 -j ACCEPT -m comment --comment prometheussudo apt-get install -y iptables-persistent sudo service netfilter-persistent save
Настройка экспортеров
Настройка Node Exporter
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Заметка
Настройка HTTPS c аутентификацией
sudo cp ~/example.justnikobird.ru.crt /opt/node_exporter/ sudo cp ~/example.justnikobird.ru.key /opt/node_exporter/sudo apt-get install -y apache2-utils htpasswd -nbB -C 10 admin "password"admin:$2y$10$iWOlBiff2IDDovW2wy2SauStp7ahuHpOULM2W7yQ6JpNcbDKeBPYStls_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'Настройка технической учетной записи
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"Настройка systemd unit
[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.targetsudo systemctl daemon-reload sudo systemctl restart node_exporter.service sudo systemctl enable node_exporter.serviceНастройка iptables
sudo iptables -A INPUT -p tcp -s 10.0.0.6 --dport 9100 -j ACCEPT -m comment --comment prometheus_node_exporterЗаметка
sudo apt-get install -y iptables-persistent sudo service netfilter-persistent saveСборка deb-пакета Node Exporter
/opt/node_exporter/web.yml /usr/bin/node_exporter /etc/systemd/system/node_exporter.serviceinstall
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"Настройка OpenVPN Exporter
sudo apt-get install -y golangwget -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Заметка
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.gosudo cp ~/openvpn_exporter-0.3.0/main /usr/bin/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"sudo usermod -a -G openvpn_exporter rootsudo chgrp openvpn_exporter /var/log/openvpn/openvpn-status.log sudo chmod 660 /var/log/openvpn/openvpn-status.logНастройка systemd unit
[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.targetsudo systemctl daemon-reload sudo systemctl restart openvpn_exporter.service sudo systemctl enable openvpn_exporter.serviceНастройка iptables
sudo iptables -A INPUT -p tcp -s 10.0.0.6 --dport 9176 -j ACCEPT -m comment --comment prometheus_openvpn_exporterЗаметка
sudo apt-get install -y iptables-persistent sudo service netfilter-persistent saveСборка deb-пакета OpenVPN Exporter
/usr/bin/openvpn_exporter /etc/systemd/system/openvpn_exporter.serviceinstall
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"Настройка Nginx Exporter
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
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/# 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"Настройка технической учетной записи
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"Настройка systemd unit
[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.targetsudo systemctl daemon-reload sudo systemctl restart nginx_exporter.service sudo systemctl enable nginx_exporter.serviceНастройка iptables
sudo iptables -A INPUT -p tcp -s 10.0.0.6 --dport 9113 -j ACCEPT -m comment --comment prometheus_nginx_exporterЗаметка
sudo apt-get install -y iptables-persistent sudo service netfilter-persistent saveСборка deb-пакета Nginx Exporter
/usr/bin/nginx-prometheus-exporter /opt/nginx_exporter/prometheus-nginx-exporter /etc/systemd/system/nginx_exporter.serviceinstall
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"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
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/*.crt127.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 экспортера
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']sudo promtool check config /etc/prometheus/prometheus.ymlНастройка 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_exportersudo apt-get install -y iptables-persistent sudo service netfilter-persistent savesudo systemctl restart prometheus.service
Настройка Prometheus AlertManager
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/Подробнее о файлах
sudo mkdir /etc/prometheus/alertmanager_datasudo touch /etc/prometheus/rules.ymlalerting: alertmanagers: - scheme: https basic_auth: username: admin password: password tls_config: ca_file: monitor.justnikobird.ru.crt static_configs: - targets: ['monitor.justnikobird.ru:9093']sudo promtool check config /etc/prometheus/prometheus.ymlНастройка HTTPS c аутентификацией
/etc/prometheus/web.ymlНастройка получателей алертов:
Подготовка данных для получения алертов по Email



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_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
[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.targetsudo systemctl daemon-reload sudo systemctl restart prometheus-alertmanager.service sudo systemctl enable prometheus-alertmanager.serviceНастройка 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 smtpsudo apt-get install -y iptables-persistent sudo service netfilter-persistent saveНастройка триггеров
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']
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'sudo promtool check rules /etc/prometheus/rules.ymlsudo systemctl restart prometheus-alertmanager.service sudo systemctl restart prometheus.service



Сборка deb-пакета Prometheus с AlertManager
/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.serviceinstall
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/systemcontrol
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"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
Настройка Grafana
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Заметка
Настройка HTTPS
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.*[server] protocol = https domain = monitor.justnikobird.ru cert_file = /etc/grafana/monitor.justnikobird.ru.crt cert_key = /etc/grafana/monitor.justnikobird.ru.keysudo systemctl daemon-reload sudo systemctl restart grafana-server.service sudo systemctl enable grafana-server.serviceНастройка iptables
sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT -m comment --comment grafanasudo apt-get install -y iptables-persistent sudo service netfilter-persistent saveПодключение Prometheus к Grafana


Настройка dashboard

Загрузка deb-пакета 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
ссылка на оригинал статьи https://habr.com/ru/articles/783572/
Добавить комментарий