Добавлены элементы авто обнаружения и обычные элементы в шаблон.
Как работает запускается скрипт на хосте(ПК) считает размеры папок и пердает их в элемент(ы) через траппет.
Как запускается скрипт:
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] 2.3.Запускать скрипт с Заббикс сервера чрез внешнюю проверку указав ключ size-dir.sh[{HOST.CONN},runscript,'{$SCRIPT.DIR}',"'{HOST.HOST}'","'{$PATH.DIR}'"] (тут получается что сперва даем внутреннему скрипту данные после он запускает внешний скрипт на удаленном хосте)
3.Получение данных после запуска скрипта 2 варианта:
Авто обнаружение нам создает из прототипов элементов, элементы данных
3.1.Из скрипта для каждого элемента шлем данные через trapper из выполняемого цикла для каждой директории
Прототип элемента Имя Size-Dir-Trapper-{#DIRSIZELINUX} Ключ folder[{#DIRSIZELINUX}] 3.2.Из скрипта отправляем данные после выполнения циклов одним Логом в 1 элемент данных через trapper Имя Size-Dir-Trapper-LOG Ключ dirlog
далее в прототипах элементов создаем зависимые элементы данных от основного элемента, и распарсиваем лог по элементам по регулярке.
Установить если не установлен 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}"
# Входные данные $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]
Ключ system.run[$('{$SCRIPT.DIR}' {$HOST.PORTS} '{HOST.HOST}' '{$PATH.DIR}'),nowait]
Ключ system.run[`'{$SCRIPT.DIR}' {$HOST.PORTS} '{HOST.HOST}' '{$PATH.DIR}'`,nowait]
Ключ system.run[{$SCRIPT.DIR} "{HOST.HOST}" "{$PATH.DIR}",nowait] -Windows
Ключ system.run['{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}',nowait] -Linux
Или делаем через основной скрипт поиска директорий
Получаем следующий вид ключа заббикс Внешняя проверка
Одни кавычки теряются при входе в ходе скрипт, далее надо передать значение так же в кавычка экранировано по этому 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] более прямой путь запроса
И элементы на основе лога