вторник, 28 июня 2022 г.

Rocky Linux 8. Prometheus. Опрос сетевых устройств по SNMP

Prometheus имеет в своей коллекции экспортер «snmp_exporter», который предназначен для сбора метрик с устройств, поддерживающих SNMP.
SNMP экспортер анализирует MIBS SNMP и создает конфигурационный файл, содержащий OID, которые сопоставляются с метриками Prometheus. Затем SNMP экспортер запрашивает SNMP-агенты сети по указанным OID и отображает результаты в виде счетчиков понятных Prometheus.

Ссылка для скачивания файлов проекта «snmp_exporter»: 

https://github.com/prometheus/snmp_exporter/tree/master/generator
Экспортеру «snmp_exporter» для работы нужны MIBы с устройств.
Получить большую коллекцию MIB можно скачав базу проекта librenms: https://github.com/librenms/librenms
# cd /usr/src/
# git clone https://github.com/librenms/librenms.git
MIBы будут в директории /usr/src/librenms/mibs/

Скачиваем файлы проекта «snmp_exporter»
# git clone https://github.com/prometheus/snmp_exporter.git

Создание исполняемого файла экспортера «snmp_exporter» выполняется так:
# cd snmp_exporter
# go build
Произойдет сборка файла snmp_exporter, который нужно скопировать в директорию с исполняемыми файлами:
# cp snmp_exporter /usr/local/bin/snmp_exporter
Создаем пользователя для работы с экспортером и даем ему права на исполняемый файл
# useradd -M -r -s /bin/false snmp_exporter
# chown snmp_exporter:snmp_exporter /usr/local/bin/snmp_exporter
# mkdir /usr/local/bin/snmp_exporter_conf
Экспортер умеет опрашивать SNMP агент только по определенному набору SNMP параметров. При этом экспортер обращается к специально собранному файлу конфигурации для Prometheus.

То есть экспортеру «snmp_exporter» нужно четко и «по-свойски» рассказать, какие параметры SNMP опрашивать у SNMP-агента. Для и нужно создать специальный файл конфигурации. Специальный файл конфигурации создается специальным генератором, входящий в комплект скаченных файлов «snmp_exporter». Сборка генератора:
# cd generator
# yum install gcc gcc-c++ make net-snmp net-snmp-utils net-snmp-libs net-snmp-devel
# yum install go p7zip
# go build
После выполнения этой команды создается файл-утилита generator.
Эта утилита generator как раз и умеет генерить специальный файл конфигурации для экспортера «snmp_exporter» Prometheus.
Утилита в своей работе использует
 - переменную окружения MIBDIRS, в которой указывается путь к MIB файлу опрашиваемых значений
 - файл конфигурации generator.yml, который определяет, что нужно опрашивать у элемента. Данный файл нужно править вручную.

На всякий случай сделаем резервную копию generator.yml:
# cp generator.yml generator.yml_example
Теперь нужно отредактировать файл generator.yml
Если необходимо опрашивать порты у оборудования Cisco, то файл должен быть таким:

modules:
  snmp2_public_cisco:
    version: 2
    max_repetitions: 60
    retries: 1
    timeout: 5s
    auth:
      community: public
    walk:
       - sysName
       - 1.3.6.1.2.1.31.1.1.1.10
       - 1.3.6.1.2.1.31.1.1.1.6
    lookups:
      - source_indexes: [ifIndex]
        lookup: ifAlias
      - source_indexes: [ifIndex]
        lookup: ifDescr
      - source_indexes: [ifIndex]
        lookup: ifName
    overrides:
      ifType:
        type: counter


Указываем переменной MIBDIRS место расположения MIB файлов, относительно текущего места
# export MIBDIRS=../../librenms/mibs:../../librenms/mibs/cisco
Затем запускаем генератор:
# ./generator generate
После выполнения команды генератор создается файл конфигурации экспортера snmp.yml на основе файла generator.yml.
При удачном раскладе вывод команд будет такой:
# ./generator generate
level=info ts=2022-06-28T12:47:27.245Z caller=net_snmp.go:161 msg="Loading MIBs" from=../../librenms/mibs:../../librenms/mibs/cisco
level=warn ts=2022-06-28T12:47:28.418Z caller=main.go:120 msg="NetSNMP reported parse error(s)" errors=3
level=info ts=2022-06-28T12:47:28.967Z caller=main.go:52 msg="Generating config for module" module=snmp2_public_cisco
level=info ts=2022-06-28T12:47:29.136Z caller=main.go:67 msg="Generated metrics" module=snmp2_public_cisco metrics=3
level=info ts=2022-06-28T12:47:29.138Z caller=main.go:92 msg="Config written" file=/usr/src/snmp_exporter/generator/snmp.yml

А при неудачном выполнении, например, такой:
# ./generator generate
level=info ts=2022-06-28T12:41:56.768Z caller=net_snmp.go:161 msg="Loading MIBs" from=../../librenms/mibs:../../librenms/mibs/cisco
level=warn ts=2022-06-28T12:41:57.930Z caller=main.go:120 msg="NetSNMP reported parse error(s)" errors=3
level=info ts=2022-06-28T12:41:58.434Z caller=main.go:52 msg="Generating config for module" module=snmp2_public_cisco
level=error ts=2022-06-28T12:41:58.627Z caller=main.go:130 msg="Error generating config netsnmp" err="cannot find oid '1.3.6.1.4.1.171.12.1.1.6.2' to walk"

После выполнения скрипта создается конфиг snmp.yml
# cp snmp.yml /usr/local/bin/snmp_exporter_conf/snmp.yml

Создаем юнит systemd для управления работой экспортера:
# nano /etc/systemd/system/snmp_exporter.service

[Unit]
Description=SNMP Exporter Service for Prometheus
After=network-online.target

[Service]
User=snmp_exporter
Group=snmp_exporter
Restart=on-failure
ExecStart=/usr/local/bin/snmp_exporter --config.file='/usr/local/bin/snmp_exporter_conf/snmp.yml'

[Install]
WantedBy=multi-user.target

# systemctl daemon-reload
# systemctl start snmp_exporter
# systemctl enable snmp_exporter

Экспортер «snmp_exporter» при работе открывает порт 9116.
Проверка работы сервиса:
# netstat -ltupn | grep 9116
По этому порту будет происходить обращение сервиса Prometheus к экспортеру для того что бы забрать данные.

Добавление нового источника данных на сервере Prometheus
# nano /etc/prometheus/prometheus.yml

  - job_name: 'snmp'
    scrape_interval: 180s
    static_configs:
      - targets:
        - 10.100.16.1
        - 10.100.55.2
        - 10.100.55.5
        - 10.100.55.12
    metrics_path: /snmp
    params:
      module: [snmp2_public_cisco]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 10.10.49.166:9116

В этой конфигурации 10.10.49.166:9116 – это IP и порт на котором работает snmp_exporter, перечень IP в разделе «- targets:» - это опрашиваемые IP адреса, а значение модуля module - «snmp2_public_cisco» - это модуль из конфигурационного файла generator.yml / snmp.yml
Рестартуем сервис:
# systemctl restart prometheus

В Grafana для отображения графиков собираемых метрик можно использовать конструкции данных, например:
irate(ifHCOutOctets{ifDescr="TenGigabitEthernet0/0/0", instance="10.200.255.12"}[10m])*8
irate(ifHCInOctets{ifDescr="TenGigabitEthernet0/0/0", instance="10.200.255.12"}[10m])*8
Вид графика:
 




понедельник, 27 июня 2022 г.

Rocky Linux 8. Prometheus и Clickhouse.

Для того что бы Prometheus мог собирать метрики с сервера Clickhouse существует отдельный экспортер, предназначенный для этого – «clickhouse_exporter».

Производим установку clickhouse_exporter на сервер, где размещен сервер clickhouse.

# cd /usr/src/
# git clone https://github.com/ClickHouse/clickhouse_exporter.git
# cd clickhouse_exporter/
# go build

Произойдет сборка исполняемого файла и появится файл clickhouse_exporter
Запуск экспортера выполняется командой
./clickhouse_exporter

Копируем файл clickhouse_exporter в директорию с исполняемыми файлами:
# cp clickhouse_exporter /usr/local/bin/clickhouse_exporter
Создаем пользователя clickhouse_exporter под которым будет работать сервис clickhouse_exporter.
# useradd -M -r -s /bin/false clickhouse_exporter
# chown clickhouse_exporter:clickhouse_exporter /usr/local/bin/clickhouse_exporter


Создаем unit systemd для автозапуска сервиса:
# nano /etc/systemd/system/clickhouse_exporter.service

[Unit]
Description=ClickHouse Exporter Service for Prometheus
After=network.target

[Service]
User=clickhouse_exporter
Group=clickhouse_exporter
Type=simple
ExecStart=/usr/local/bin/clickhouse_exporter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Запускаем сервис:
# systemctl daemon-reload
# systemctl start clickhouse_exporter
# systemctl enable clickhouse_exporter


Сервис clickhouse_exporter работает на порту 9116.
Проверка работы сервиса:
# netstat -ltupn | grep 9116
По умолчанию экспортер обращается к базе Clikhouse по URL «http://localhost:8123/», а данные для Prometheus будут доступны на порту сервиса - 9116, по пути /metrics
Например, http://10.10.49.165:9116/metrics


Если требуются учетные данные для доступа к Clickhouse, то логин-пароль
задается через переменные окружения:
CLICKHOUSE_USER
CLICKHOUSE_PASSWORD


Теперь сервис Prometheus нужно научить обращаться к экспортерам Clickhouse.
Для этого на сервере Prometheus необходио внести правки к конфигурационный файл prometheus.yml
# nano /etc/prometheus/prometheus.yml
В раздел scrape_configs:
добавляем ссылки на метрики, которые генерируют node_exporter

  - job_name: 'clickhouse_exporter_clients'
    scrape_interval: 5s
    static_configs:
      - targets: ['10.10.49.165:9116']
Для применения изменений сервис prometheus нужно перезапустить:
# systemctl restart prometheus

Для удобного просмотра метрик целесообразно использовать Grafana.
Dashboard Clikhouse имеет в коллекции Grafana ID - 882
В Grafana выбираем + -> Import, в поле "Import via grafana.com" вписываем 882, нажимаем Load
Затем выбираем источник Prometheus и нажимаем Import.
И можно наслаждаться красивыми графиками загрузки Clickhouse



суббота, 25 июня 2022 г.

RockyLinux 8. Установка Prometheus. node_exporter. Grafana.

Prometheus – это система сбора статистики с элементами мониторинга, использующая собственную эффективную базу данных для хранения информации. По умолчанию база хранить данные за последние 14 дней, что для оперативного мониторинга состояния вполне достаточно.
Prometheus – это не законченное решение по типу Zabbix. Это высокопроизводительный каркас, к которому можно прикрутить и триггер событий, и web-dashboard, и красивую форму аналитики. Обычно в качестве web-dashboard для просмотра текущих метрик Prometheus используют Grafana.
Сайт проекта: https://prometheus.io/

Система Prometheus состоит из серверной части (базы данных) и так называемых экспортеров (exporter). Экспортеры занимаются опросом и подготовкой метрик для серверной части. Серверная часть с установленной периодичностью (по умолчанию 5 секунд) обращается к экспортерам и забирает оттуда готовые метрики для вставки в базу данных. Существует так же режим pull, когда собранные данные отправляются сразу в серверную часть без участия экспортера. Перечень типовых экспортеров можно найти на странице: https://prometheus.io/docs/instrumenting/exporters/. Для сбора данных с серверов Linux используется обычно экспортер под названием «node_exporter». Каждый модуль системы grafana скачивается и собирается на сервере отдельно. Установить Prometheus с использованием пакетного менеджера нельзя.

Установка Prometheus.

Сервер Prometheus использует для работы порт TCP 9090. Этот же порт использует WEB- dashboard Cockpit встроенный в Rocky Linux 8.
Отключим WEB- dashboard Cockpit:
# systemctl stop cockpit.socket
# systemctl disable cockpit.socket

Переходим на страницу загрузки Prometheus
https://prometheus.io/download/
В разделе prometheus ищем стабильный релиз для Linux. alpha, rc, beta и прочие релизы отметаем.
Копируем ссылку на файл архива.
Например, https://github.com/prometheus/prometheus/releases/download/v2.33.5/prometheus-2.33.5.linux-amd64.tar.gz

Переходим в консоль сервера, на котором будем выполнять установку серверной части Prometheus. Сначала создаем пользователя и группу prometheus, под которым будет работать сервис Prometheus
# useradd -M -r -s /bin/false prometheus
Ключ -M: пользователь не имеет домашней директории
Ключ -s /bin/false запрещает пользователю входить в консоль
Ключ -r создает системную группу

Скачиваем и распаковываем архив по ссылке скопированной ранее
# cd /usr/src/
# wget https://github.com/prometheus/prometheus/releases/download/v2.33.5/prometheus-2.33.5.linux-amd64.tar.gz
# tar zxvf prometheus-2.33.5.linux-amd64.tar.gz
# cd prometheus-2.33.5.linux-amd64

Создаем дополнительные директории для работы сервиса Prometheus и раскладываем файлы из архива по системе Linux:
# mkdir /etc/prometheus
# mkdir /var/lib/prometheus
Бинарные файлы копируем в директорию исполняемых файлов:
# cp prometheus promtool /usr/local/bin/
Конфигурационные файлы в соответствующую директорию:
# cp -r console_libraries consoles prometheus.yml /etc/prometheus
Главный конфигурационный файл получился тут: /etc/prometheus/prometheus.yml

Определяем права для скопированных файлов и и созданных директорий:
# chown -R prometheus:prometheus /etc/prometheus
# chown -R prometheus:prometheus /var/lib/prometheus
# chown prometheus:prometheus /usr/local/bin/{prometheus,promtool}

Проверочный запуск:
# /usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml
Запуск должен завершиться сообщением:
level=info msg="Server is ready to receive web requests."
Теперь к интерфейсу можно подключиться так:
http://<IPадрес>:9090/graph
Встроенный WEB-интерфейс серверной части Prometheus выглядит так:

 

Остановка сервиса в консоли выполняется командой CTRL+C

Для запуска Prometheus в автоматическом режиме нужно создать unit system в Linux
# touch /etc/systemd/system/prometheus.service
# nano /etc/systemd/system/prometheus.service
Содержимое файла:
[Unit]
Description=Prometheus Time Series Collection and Processing Server
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/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
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Затем:
# systemctl daemon-reload
Запускаем сервис:
# systemctl enable prometheus
# systemctl start prometheus
Просмотр статуса сервиса:
# systemctl status prometheus.service


Установка node_exporter.

Служба node_exporter предназначена для сбора по запросу Prometheus основных данных с сервера Linux, преобразование в формат удобный для базы Prometheus и передача данных в базу.

Для установки экспортера nose_exporter копируем ссылку со страницы загрузки https://prometheus.io/download/#node_exporter. Например, это может быть ссылка:
https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
Из консоли сервера, который будем мониторить, выполняем команды загрузки файла архива на сервер. Затем производим распаковку:
# cd /usr/src/
# wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
# tar zxvf node_exporter-1.3.1.linux-amd64.tar.gz
Копируем файл node_exporter в директорию с исполняемыми файлами:
# cp node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/node_exporter

Создаем пользователя node_exporter под которым будет работать утилита node_exporter.
# useradd -M -r -s /bin/false node_exporter
# chown node_exporter:node_exporter /usr/local/bin/node_exporter

Создаем unit systemd для автозапуска сервиса в Linux
# nano /etc/systemd/system/node_exporter.service
Содержимое файла:
[Unit]
Description=Node Exporter Service for Prometheus
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Активируем юнит:
# systemctl daemon-reload
# systemctl start node_exporter
# systemctl enable node_exporter

Теперь метрики могут собираться с данного сервера с порта 9100
Проверка того, что порт 9100 открыт и используется:
# netstat -ltupn | grep 9100
К порту можно обратиться теперь так:
http://<IPадрес>:9100/metrics
Пример ответа:


Теперь сервис Prometheus нужно научить обращаться к экспортеру «node_exporter».
Для этого на сервере Prometheus необходимо внести правки к конфигурационный файл prometheus.yml
# nano /etc/prometheus/prometheus.yml
В раздел «scrape_configs:» добавляем ссылки на метрики, которые генерируют node_exporter
  - job_name: 'node_exporter_clients'
    scrape_interval: 5s
    static_configs:
      - targets: ['10.10.8.2:9100','10.10.1.2:9100']

Тут для примера показано, что сервису Prometheus нужно с периодичностью 5 секунд опрашивать экспортеры, работающие на адресах 10.10.8.2:9100 и 10.10.1.2:9100.
Для применения изменений сервис Prometheus нужно перезапустить:
# systemctl restart prometheus

Для просмотра значения метрик можно использовать уже встроенный WEB-интерфейс Prometheus http://<IPадрес>:9090/graph
Примеры метрик, которые можно получать в интерфейсе Prometheus
node_memory_MemFree_bytes
node_cpu_seconds_total
node_filesystem_avail_bytes
rate(node_cpu_seconds_total{mode="system"}[1m])
rate(node_network_receive_bytes_total[1m])
rate(node_network_transmit_bytes_total[1m])
Метрику нужно ввести в поисковый запрос и переключиться на вкладку Graph. Пример:



Но обычно для просмотра метрик используют что-то более дружелюбное и красивое – например Grafana.

Установка Grafana.

Grafana представляет собой красивый и удобный web-интерфейс для чтения метрик из Prometheus. Установка выполняется через rpm.
# yum install https://dl.grafana.com/oss/release/grafana-8.0.5-1.x86_64.rpm
# systemctl daemon-reload
# systemctl start grafana-server
# systemctl enable grafana-server

Grafana сервер работает на порту 3000. Проверить то, что порт открыт на сервере нужно так:
# netstat -ltupn | grep 3000
Обратиться к серверу можно теперь так:
http://<IPадрес>:3000/ 


По умолчанию данные для входа admin / admin
После первого входа сразу будет предложено сменить пароль.
После чего стартовая страница Grafana будет выглядеть так:

Добавляем источник данных DATA SOURCES. Выбираем Prometheus (если его нет среди предложенных, то используем поисковую строку)


Затем вписываем в поле URL путь сервису Prometheus. Например, «http://10.10.49.166:9090»
Нажимаем "Save&test" (внизу страницы)

На завершающем этапе нужно создать Dashboard. Это можно сделать вручную по нужным метрикам. Или Dashboard можно импортировать с сайта https://grafana.com/grafana/dashboards/ . Тут есть множество готовых dashboard.
Самый полный для node_exporter - это "Node Exporter Full"
Его URL - https://grafana.com/grafana/dashboards/1860
В конце URL есть число. Это ID готового dashboard. Запоминаем ID 1860.
В Grafana выбираем Import, в поле "Import via grafana.com" вписываем 1860, нажимаем Load
 


Затем выбираем источник Prometheus и dashboard будет создан в системе Grafana.
Теперь к dashboard можно обратиться через раздел Manage  General и выбрать Node Exporter Full


Откроется панель отображения параметров сервера:

 
Вверху слева можно выбирать интересующий сервер из выпадающего списка.









понедельник, 20 июня 2022 г.

Восстановление доступа к ПК с неизвестным паролем и с ОС Windows XP и Windows 7

Один из возможных простых способов получения доступа к ПК с ОС Windows XP и Windows 7 – это сбросить пароль учетной записи Администратора ПК с помощью утилиты «Offline NT Password and Registry editor».
Утилита «Offline NT Password and Registry editor» скачивается с сайта https://pogostick.net/~pnh/ntpasswd/ и фактически представляет собой загрузочный мини-образ ОС Linux. Ссылки для скачивания образа для USB: https://pogostick.net/~pnh/ntpasswd/bd080526.zip
Скаченный архив распаковываем на пустую флешку и в консоли Windows выполняем команду:  

>X:syslinux.exe -ma X:

Где X – это буква флешки в текущем Windows. После выполнения данной команды USB носитель с мини-образом Linux готов для использования.
Теперь необходимо загрузиться с данной флешки на том ПК, где нужно сбросить пароли Администратора Windows.
При загрузке с флешки с «Offline NT Password and Registry editor» получаем приглашение:

Тут нужно просто нажать «Enter».
Далее программа предложит выбрать раздел жесткого диска с которого производиться загрузку ОС Windows. В этом разделе с файлами Windows находиться файл с паролями «SAM», доступ к которому и нужно получить нашей программе.  
Далее программа попросит подтвердить выбор раздела (ветки реестра), где расположены данные по учетным записям.
Затем нужно указать действие, которое требуется провести, а именно «Password reset»
На следующем этапе выбираем «Edit user data and passwords»
 И вписываем код RID пользователя
Для пользователя User, например, я ввел «03eb». Вводим коды, а не имена, чтобы не привязываться к нечитаемым именам, заданным, например, кириллицей.
Попадаем в раздел меню для совершения действий с пользователем. Тут выбираем 1 «Clear (blank) user password»  и нажимаем Enter.
Произойдет сброс пароля. На экране отобразиться лог изменений.
Для выхода из режима редактирования пользователя набираем «q». Мы перейдем  меню выбора действий. Опять выбираем «q». И соглашаемся провести изменения в системе, набрав «y».
Теперь при нормальной загрузке ПК пароль пользователя нужно оставить пустым и вход в ОС Windows успешно произойдет.

воскресенье, 5 июня 2022 г.

PHP. Переход от запросов с помощью mssql_query к запросам PDO.

В PHP есть устаревшие функции работы с MSSQL - mssql_connect и mssql_query. В один прекрасный момент они перестают работать. Выражается это так, что при выполнении директивы mssql_query скрипт выдает «Ошибка сегментирования» и программа останавливается. Причем в логах ничего дополнительно не пишется.
Для того, что бы и продолжать работать с MS SQL необходимо переписать скрипт на использование PDO.


Пример, того как было:
$link = mssql_connect('IP-АДРЕС', 'ЛОГИН', 'ПАРОЛЬ');
if (!$link || !mssql_select_db('БАЗА-ДАННЫХ', $link)) {
    die('Unable to connect or select database!');
}
$q = "СТРОКА ЗАПРОСА";
$resp = mssql_query($q);
while($row = mssql_fetch_assoc($resp)) {
        echo var_dump($row).PHP_EOL;
}


Пример того, как стало:
$db = new PDO('dblib:host=IP-АДРЕС;dbname=БАЗА-ДАННЫХ;charset=utf8', 'ЛОГИН', 'ПАРОЛЬ');
$q = "СТРОКА ЗАПРОСА";   
$result = $db->query($q);
while($row = $result->fetch(PDO::FETCH_ASSOC)) {
    echo var_dump($row).PHP_EOL;
}