Обнаружение папок и запрос их размера LLD Шаблон + Скрипт

Различные шаблоны для системы мониторинга Заббикс
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 293
Зарегистрирован: Вс фев 17, 2019 17:47
Репутация: 4
Откуда: Вологодская область
Контактная информация:

Обнаружение папок и запрос их размера LLD Шаблон + Скрипт

Сообщение Артём Мамзиков » Сб апр 24, 2021 17:05 #11

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

Добавлены элементы авто обнаружения и обычные элементы в шаблон.
Как работает запускается скрипт на хосте(ПК) считает размеры папок и пердает их в элемент(ы) через траппет.
Как запускается скрипт:
1) Через элемент данных в заббиксе 2 варианта что удобнее прописывается частота запуска опроса переменные в макросы.
2) Вариант при помощи планировщика заданий Cron далее либо в нем указываются входные данные в скрипт что проверяем или же назначаем переменные в самом скрипте.

При запросе Элемента данных Zabbix агент и Zabbix активный агент - у нас ограничение по времени ответа, т.е. ответ должен успеть придти за указанное время в файле конфигурации сервера и агента, максимальное время 30 секунд!
В нашем случае опрос директорий с множеством папок и файлов может занять длительное время опроса размера.
У меня периодически срабатывали триггеры на то что нет данных более 24 часов, опрос был 465 папок из них 120 например вылетали в ошибку что нет данных. Переделка из пассивного в активный агент данную проблему не решила. Таймаут был 15 секунд.


"При наличии больших директорий или медленных дисков этот элемент данных может превысить время ожидания из-за настройки Timeout в файлах конфигурации агента и сервера/прокси. При необходимости увеличьте эти значения времени ожидания."

Получаем что обнаружение у нас работает хорошо оставляем его без изменений, а вот с запросом элементов данных у нас есть проблемы.
Вместо ключа vfs.dir.size будем использовать, другой ключ. Так же Тип: Элемента данных Заббикс агент и Заббикс агент активный нам не подходит, и сделать скрипт на хосте у агента прописать его в конфиг назначить пользовательский ключ, ничего нее выйдет так как опять работа через агента время ограниченно и приходим к той же проблеме.

Некоторые варианты скрипта:
1. Скрипт запускается через крон (в скрипте надо указывать пути на проверяемы директории или входные данные в команде крон) и отдает через траппер: какому узлу, в узле какому элементу, размер в байтах (получаем вроде активного агента но без, конкретного времени ожидания)

2. Можно сделать скрипт с входными данными указав их в ключе, далее скрипт нам отдаст размер опять же получаем ограничение времени на ответ аналогично ключу vfs.dir.size) не подходит

3. Вывести скриптом размер директорий в файл лога и забрать значения из файла лога уже посчитанные, и не тратить время на ожидания подсчета.

4. Получить списком через траппер данные виде одного лога и сделать зависимые элементы на основе его (что то вроде распарсивание данных для элементов по регуляркам)

5. Сделать через внешнюю проверку, через скрипт вместо заббикс агента

Скажу сразу что вышло в итоге:
1.Скрипт закидывается на хост с которого нам нужно получить данные

2.Запуск скрипта:
2.1.Можно прописать его в Крон с входными параметрами или задать переменные внутри скрипта.
2.2.Запускать скрипт с Заббикс сервера через заббикс агент указав ключ system.run['{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}',nowait]
Запуск удаленного скрипта, через заббикс агент.jpg
Запуск удаленного скрипта, через заббикс агент
2.3.Запускать скрипт с Заббикс сервера чрез внешнюю проверку указав ключ size-dir.sh[{HOST.CONN},runscript,'{$SCRIPT.DIR}',"'{HOST.HOST}'","'{$PATH.DIR}'"] (тут получается что сперва даем внутреннему скрипту данные после он запускает внешний скрипт на удаленном хосте)
Запуск удаленного скрипта, через основной Linux.jpg
Запуск удаленного скрипта, через основной Linux

3.Получение данных после запуска скрипта 2 варианта:
Авто обнаружение нам создает из прототипов элементов, элементы данных
3.1.Из скрипта для каждого элемента шлем данные через trapper из выполняемого цикла для каждой директории
Прототип элемента Имя Size-Dir-Trapper-{#DIRSIZELINUX} Ключ folder[{#DIRSIZELINUX}]
Size-Dir-Trapper-{#DIRSIZELINUX}.jpg
Size-Dir-Trapper-{#DIRSIZELINUX}
3.2.Из скрипта отправляем данные после выполнения циклов одним Логом в 1 элемент данных через trapper Имя Size-Dir-Trapper-LOG Ключ dirlog
далее в прототипах элементов создаем зависимые элементы данных от основного элемента, и распарсиваем лог по элементам по регулярке.
Size-Dir-Trapper-LOG.jpg
Size-Dir-Trapper-LOG
Size-Dir-Trapper-LOG-{#DIRSIZELINUX}.jpg
Size-Dir-Trapper-LOG-{#DIRSIZELINUX}

Установить если не установлен zabbix_sender

Инструкция под Linux OS
Скачать можно например
http://repo.zabbix.com/zabbix/4.2/debia ... /z/zabbix/ пакет zabbix-sender_4.2.8-1+jessie_amd64.deb для 8 debian 64-bit
Установка
dpkg -i zabbix-sender_4.2.8-1+jessie_amd64.deb


Переходим непосредственно к написанию скрипта.
Для скрипта нам нужны входные данные, куда направлять ответ и что проверять:
$1 - Имя узла сети {HOST.HOST}
$2 - Директории через точку запятую какие нужно проверить

Тестовая отправка и прием данных
Формируем для заббикс сервера, под ключ ответ
1.Со стороны хоста отправка через траппер
zabbix_sender -z 192.168.175.111 -p 10051 -s HOST.HOST -k Имя-директории -o полученный-размер
zabbix_sender -z 192.168.175.111 -p 10051 -s cloud -k folder[/var/www/owncloud/data/проверяемая/] -o 4386280

Прием со стороны Заббикс Сервера прототип ключа автобнаружения
folder[{#DIRSIZELINUX}]
получаем folder[/var/www/owncloud/data/проверяемая/]

Все ок работает можно делать скрипт)

Еще протестировал другой вариант
2.Пример на основе зависимых элементов передаем весь текст через траппер
Делаем зависимый элементов
Регулярка /var/www/owncloud/data/ZalyginaES/ ([0-9]+) вывод \1 - получаем размер

3.Можно попробовать сделать ключ запроса system.run["du -s {#DIRSIZELINUX}| awk '{print $1}'"] но опять же получаем работу через агента ограничение по времени ответа

Получился такой скрипт для удаленного хоста dir-size-trappet.sh
dir-size-trappet.sh
Показать
#!/bin/bash

# Входные данные $1 -Имя узла сети {HOST.HOST} ; $2 - Директории через точку запятую какие нужно проверить
# Пример команды ./ИмяТекущегоСкрипта.sh "HOST.HOST" "/root;/var/www/owncloud/data"
# Данный скрипт в указанной папке сканирует директории, далее поочередно запрашивает их размер

# Проверка нескольких директорий на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo $2)

# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# # ls -aF a -отобразить все содержимое, параметр F -Добавить специальные символы к именам файлов, которые показывают, что это за файл
get=`ls -F "${puti}"|grep -E \*/`

# Запрашиваем папки циклом
IFS=$'\n'
for dirp in $get
do
putdir="${puti}"/"${dirp}"

# Получение размера в байтах | первый столбец (du -sb .[^.]* *)
sizedir=`du -sb "${putdir}"| awk '{print $1}'`
JSON=$JSON""${putdir}" "${sizedir}"\n"

# Вывод поочередно и отправка траппетом для каждой директории отдельно.

#echo "${putdir}" "${sizedir}"
#zabbix_sender -z 192.168.175.111 -p 10051 -s $1 -k folder["${putdir}"] -o "${sizedir}"
done
done

# Вывод одним списком для всех директорий и отправка в виде Лога

#echo -e $JSON
zabbix_sender -z 192.168.175.111 -p 10051 -s $1 -k dirlog -o "${JSON}"

Пример запроса
./dir-size-trappet.sh "HOST.HOST" "/root;/var/www/owncloud/data"
./dir-size-trappet.sh "HOST.HOST" /root


Вместо крона, запуск со стороны заббикс сервера
$1 {HOST.CONN} - IP адрес или DNS имя узла сети (192.168.101.23)
$2 {$SCRIPT.DIR} - Путь где лежит скрипт на удаленном хосте (/root/test kat d/dir-size-trappet.sh)
$3 {HOST.HOST} - Имя узла сети (cloud)
$4 {$PATH.DIR} - Путь сканируемых Директорий (/root;/var/www/owncloud/data)
Для порта $2 {$HOST.PORTS} пример zabbix_get -s $1 -p $2 -k system.run


zabbix_get -s $1 -k system.run["$2 $3 $4",nowait]
zabbix_get -s $1 -p $2 -k system.run["$3 $4 $5",nowait]

Виде элемента, так как элемент уже будет запрашивается с узла IP и Port уже не нужен получаем ключ
system.run[''{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}'',nowait]
1 - в режиме​ nowait не ожидать завершения выполнения команды (независимо от результата выполнения команды)

Ключ заббикс через Zabbix агент (дает команду на запуск скрипта на удаленном хосте)
Ключ system.run['{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}',nowait]
Ключ system.run['{$SCRIPT.DIR}' {$HOST.PORTS} '{HOST.HOST}' '{$PATH.DIR}',nowait]



Или делаем через основной скрипт поиска директорий
Получаем следующий вид ключа заббикс Внешняя проверка
Одни кавычки теряются при входе в ходе скрипт, далее надо передать значение так же в кавычка экранировано по этому 2ные кавычки
size-dir.sh[{HOST.CONN},runscript,'{$SCRIPT.DIR}',"'{HOST.HOST}'","'{$PATH.DIR}'"]
Проверка командой на сервере
cd /usr/local/share/zabbix/externalscripts
./size-dir.sh '192.168.175.111' 'runscript' "'/root/test kat d/dir-size-trappet.sh'" "'agentzabbixserver'" "'/root'"

Добавлено в основной скрипт следующее:
Ключ size-dir.sh[{HOST.CONN},runscript,'{$SCRIPT.DIR}',"'{HOST.HOST}'","'{$PATH.DIR}'"]
в скрипте
if [[ $2 = "runscript" ]]
then
zabbix_get -s $1 -k system.run["$3 $4 $5",nowait]
# Для тестирования вывод в лог
#SDATE=`date '+%d.%m.%y %H:%M:%S'`
#echo ${SDATE} zabbix_get -s $1 -k system.run["$3 $4 $5",nowait] >> /tmp/log
fi

С портом
Ключ size-dir.sh[{HOST.CONN},{$HOST.PORTS},runscript,"'{$SCRIPT.DIR}'","'{HOST.HOST}'","'{$PATH.DIR}'"]
в скрипте
if [[ $3 = "runscript" ]]
then
zabbix_get -s $1 -p $2 -k system.run["$4 $5 $6",nowait]
# Для тестирования вывод в лог
#SDATE=`date '+%d.%m.%y %H:%M:%S'`
#echo ${SDATE} zabbix_get -s $1 -p $2 -k system.run["$4 $5 $6",nowait] >> /tmp/log
fi


Разные варианты запроса папок с пробелами и экранирующие кавычки.
zabbix_get -s 192.168.175.97 -k system.run[''/root/dir-size-trappet.sh' 'cloud' '/root;/var/www/owncloud/data'',nowait]
еще пример
zabbix_get -s 192.168.175.111 -k system.run[''/root/dir-size-trappet.sh' 'agentzabbixserver' '/root;'',nowait]


скрипт можно закинуть например в /etc/zabbix/script/dir-size-trappet.sh

Лучше использовать
ключ system.run['{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}',nowait] более прямой путь запроса
И элементы на основе лога

Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 293
Зарегистрирован: Вс фев 17, 2019 17:47
Репутация: 4
Откуда: Вологодская область
Контактная информация:

Обнаружение папок и запрос их размера LLD Шаблон + Скрипт

Сообщение Артём Мамзиков » Сб май 15, 2021 20:31 #12

Для Windows скрипт на CMD bat

Данные скрипты работают нормально на формирование лог файла и далее на зависимые элементы данных, данные выводятся из скрипта для того что бы переделать кодировку из cp866 в utf8. Если использовать передачу для каждого элемента в цикле он не поддерживает русское название папок.
Еще момент при запуске скрипта через элемент заббикса путь где лежит сам скрипт на хосте не должен содержать пробелы так как system.run не работает с командой которая начинается на " двойные кавычки , а если передать в ' одинарных кавычках не работает команда в cmd по этому первая входная переменная не экранирована остальные все переменные далее ок.


Проверка
в cmd Путь-Имя-Скрипта Имя-ПК Проверяемые-Директории
C:\Windows\system32>C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "21Program" "C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"

Со стороны заббикс сервера через скрипт
root@ZABBIXSERVER:/usr/local/share/zabbix/externalscripts# zabbix_get -s 192.168.175.8 -k system.run['C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "21Program" "C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"']

root@ZABBIXSERVER:/usr/local/share/zabbix/externalscripts# ./size-dir.sh 192.168.175.8 runscriptwin 'C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat' '"21Program"' '"C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"'

dir-size-trapper-win-cp866-File.bat
dir-size-trapper-win-cp866-File.bat
Показать
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.0 30.04.2021
TITLE dir-size-trapper-win

:: Входные переменные %1 - имя узла, %2 - путь сканируемой директории
setlocal enabledelayedexpansion

set PCNAME=%1
set way=%2
:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слеш \ , разворачиваем.
set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории (накопительная переменная)
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %%a\') do set puti=!puti!%%a\%%b;
)
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%

:: Разбор по адресам (путям)
for %%c in (%puti%) do set dirname=%%c& call:size

:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех директорий и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEDIR.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEDIR.TXT"
:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEDIR.TXT") do set JSON=%%t
zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k dirlogwin -o %JSON%
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEDIR.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
:end

:size
:: Получаем размер директории в байтах (слово файлов в 866 д c<Rў)
for /f "tokens=1-3" %%d in ('2^>nul Dir %dirname% /-C /S /A:-D^|find /I "файлов"') Do Set DirSize=%%f
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
set dirname=%dirname:\=/%
:: Вывод поочередно и отправка траппетом для каждой директории отдельно. (вместо set JSON=!JSON!%DirNS%) не поддерживает русские имена папок
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %PCNAME% -k folderwin[%dirname%] -o "%DirSize%"
set DirNS=%dirname% %DirSize%\n
set JSON=!JSON!%DirNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
dir-size-trapper-win-cp1251-File.bat
dir-size-trapper-win-cp1251-File.bat
Показать
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.0 30.04.2021
TITLE dir-size-trapper-win

:: Входные переменные %1 - имя узла, %2 - путь сканируемой директории
setlocal enabledelayedexpansion

set PCNAME=%1
set way=%2
:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слеш \ , разворачиваем.
set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории (накопительная переменная)
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %%a\') do set puti=!puti!%%a\%%b;
)
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%

:: Разбор по адресам (путям)
for %%c in (%puti%) do set dirname=%%c& call:size

:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех директорий и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEDIR.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEDIR.TXT"
:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEDIR.TXT") do set JSON=%%t
zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k dirlogwin -o %JSON%
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEDIR.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
:end

:size
:: Получаем размер директории в байтах (слово файлов в 866 д ©«®ў)
for /f "tokens=1-3" %%d in ('2^>nul Dir %dirname% /-C /S /A:-D^|find /I "д ©«®ў"') Do Set DirSize=%%f
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
set dirname=%dirname:\=/%
:: Вывод по очередной и отправка траппетом для каждой директории отдельно. (вместо set JSON=!JSON!%DirNS%) не поддерживает русские имена папок
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %PCNAME% -k folderwin[%dirname%] -o "%DirSize%"
set DirNS=%dirname% %DirSize%\n
set JSON=!JSON!%DirNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION

Ответить Вложения 23

Вернуться в «Шаблоны Заббикс»