Шаблон проверки файлов

Шаблоны заббикс мониторинг связанный с файлами и директориями
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 548
Стаж: 3 года 9 месяцев
Откуда: Вологодская область
Поблагодарили: 24 раза
Контактная информация:

Шаблон проверки файлов

Сообщение Артём Мамзиков »

Основано на стандартных ключах zabbix.
Оф. Поддерживаемые ключи элементов данных

Некоторые из ключей, что можно мониторить из коробки.
vfs.file.cksum[файл] - Контрольная сумма файла, вычисленная по алгоритму используемом в UNIX cksum. Целое число.
vfs.file.contents[файл,<кодировка>] - Получение содержимого файла. Текст.
vfs.file.exists[файл] - Проверка существования файла. 0 - файл не найден;1 - файл найден.
vfs.file.md5sum[файл] - MD5 контрольная сумма файла. Строка (MD5 хэш файла).
vfs.file.regexp[файл,регулярное выражение,<кодировка>,<начальная строка>,<конечная строка>,<вывод>] - Поиск строки в файле. Строка содержащая совпадающую подстроку или то, что определено в дополнительном параметре вывод.
vfs.file.regmatch[файл,регулярное выражение,<кодировка>,<начальная строка>,<конечная строка>] - Поиск строки в файле. 0 - совпадение не найдено; 1 - найдено
vfs.file.size[файл] - Размер файла (в байтах). Целое число.
vfs.file.time[файл,<режим>] - Информация о времени файла. Целое число (Unix timestamp).
Некоторые из стандартных ключей zabbix для работы с файлами
Некоторые из стандартных ключей zabbix для работы с файлами
Файл Лог
log[файл,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<вывод>,<максзадержка>] - Мониторинг файлов журналов (логов). Журнал (лог).
log.count[файл,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<максзадержка>] - Подсчёт количества совпадающих строк в мониторинге файла журнала (логов). Целое число.
logrt[файл_regexp,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<вывод>,<максзадержка>,<опции>] - Мониторинг файлов журналов (логов) с поддержкой ротации логов. Журнал (лог).
logrt.count[файл_regexp,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<максзадержка>,<опции>] - Подсчёт количества совпадающих строк в мониторинге файла журнала (логов) с поддержкой ротации логов. Целое число.

СКАЧАТЬ
Веб проверки и проверка файла.zip
Веб проверки и проверка файла.zip
(3.19 КБ) 31 скачивание
О Веб проверке в данном шаблоне Тут

О скриптах и проверке написанной ранее ее будем переделывать в шаблон
Создание удаление копий на неделю create_backup.cmd и backup_delete.vbs
Проверка через check_bk_fs.bat или zabbix_bk.vbs
делаем проверку виде шаблона, без доп скриптов с отправкой через zabbix_sender trapper.

Делаем Шаблон на основе некоторых ключей указанных выше.
Данный шаблон облегчает настройку мониторинга файла на однотипных серверах, на частично с разными путями и названием файла. Не нужно везде вручную создавать элементы данных триггеры и группы данных, а просто прописать пару макросов в узле.
Шаблон будет для определенных серверов, у которых путь до файла одинаковый но имя файла отличается.
Например : D:\копия\базы-данных\export_bd_r304.bak у другова D:\копия\базы-данных\export_bd_r307.bak и так далее.

Будем использовать 2 макроса:
{$PUTFSESRN} - путь до файла по умолчанию в шаблоне задан D:\копия\базы-данных если он отличается на каких то узлах прописываем в узле другой путь. Так же путь может быть по сети \\192.168.507.38\базы-данных\export_bd_r307.bak.
Учитывать доступ учетной записи от которой работает заббикс агент!
{$NUM.RAYON} - номер файла соответствии с подразделением. например 307 задаем каждый на своем узле.
Получаем следующий вид пути:
{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak
Данный файл выгружается каждый день Агентом SQL (файл должен быть, дата изменения не более суток то что файл новый, и размер файла должен быть в пропорциях что означает что с бд все хорошо. Если файл стал увеличивается в разы с базой что то не то. далее файл будет упакован в архив и скопирован с текущей датой на другой сервер с бэкапом на 1 неделю, там так же проверяется что архив не битый архивация прошла успешно размер отличается от предыдущего не более чем на * %.
Шаблон Веб проверки и проверка файла
Шаблон Веб проверки и проверка файла
ЭЛЕМЕНТЫ ДАННЫХ
Проверка файлов Элементы данных zabbix
Проверка файлов Элементы данных zabbix
Имя: Время изменения свойств файла export_bd_r{$NUM.RAYON}.bak
Тип: Zabbix Агент
Ключ: vfs.file.time["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak",change]
Тип информации: Числовой (целое положительное)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Время изменения свойств файла
Время изменения свойств файла

Имя: Время изменения файла export_bd_r{$NUM.RAYON}.bak
Тип: Zabbix Агент
Ключ: vfs.file.time["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak",modify]
Тип информации: Числовой (целое положительное)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Время изменения файла
Время изменения файла
Дата время в ответе приходит в формате unixtime
можно преобразовать в дату онлайн из секунд в дату или онлайн из секунд в дату2


Имя: Наличие файла export_bd_r{$NUM.RAYON}.bak
Тип: Zabbix Агент
Ключ: vfs.file.exists["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak"]
Тип информации: Числовой (целое положительное)
Единица измерения:
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
1 - файл найден
0 - файл не найден
Наличие файла
Наличие файла

Имя: Размер файла export_bd_r{$NUM.RAYON}.bak
Тип: Zabbix Агент
Ключ: vfs.file.size["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak"]
Тип информации: Числовой (целое положительное)
Единица измерения: B
Интервал обновления: 12h
Группы элементов данных: Проверка файлов
Описание:
Размер файла
Размер файла
ТРИГГЕР
Триггер Файл бейкап АИС старый или отсутствует
Триггер Файл бейкап АИС старый или отсутствует
Имя: Файл бейкап АИС старый или отсутствует R{$NUM.RAYON}
Важность: Средняя
Выражение: {Chek:vfs.file.exists["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak"].max(25h)}=0 or
{Chek:vfs.file.time["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak",modify].fuzzytime(25h)}=0 or
{Chek:vfs.file.size["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak"].last(#2)}/{Chek:vfs.file.size["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak"].last()}<0.9 or
{Chek:vfs.file.size["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak"].last()}/{Chek:vfs.file.size["{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak"].last(#2)}>1.1
Разрешить закрывать вручную: V
Описание:
Файл выгружается SQL Агентом, архивируется бэйкапится на файловый.
D:\копия\базы-данных\export_bd_r{$NUM.RAYON}.bak

Проверки:
1.Наличие файла
2.Дата изменения файла не более 25 часов
3.Проверяем что файл не битый и увеличения размера происходит нормально.
Старый размер делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1
Активировано: V
Триггер  Файл бейкап АИС старый или отсутствует R
Триггер Файл бейкап АИС старый или отсутствует R


Проверка Копии на ФС уже в архиве с датой
реализовано в check_bk_fs.bat
Путь на архив: \\192.168.%1.9\es-backups\ES_%y%.%m%.%d%.*" в cmd путь указан по сети так как чиклом перебираются подсети и проверяется архив, с одного сервера.
по факту если проверять на каждом сервере через сервере путь D:\es-backups\ES_2022.01.11.zip
Если папка расшарена можно проверить командой
zabbix_get -s 192.168.175.8 -p 10050 -k vfs.file.exists["\\\\192.168.175.8\\es-backups\\ES_2022.01.11.zip"]
Если на большинстве серверов путь один и тот же , а на нескольких отличается можно прописать его макросом по умолчанию в шаблоне, а где отличается прописать другой путь в макросе узла.



Попытка сделать проверку виде шаблона без доп скриптов с отправкой через zabbix_sender trapper.
Шаблон Элементы данных Файловых серверов Проверки файлов
Шаблон Элементы данных Файловых серверов Проверки файлов
Триггер Файл бекапа АИС старый или отсутствует
Триггер Файл бекапа АИС старый или отсутствует
И ничего не получилось(

А все почему?
так как в элементе ключа vfs.file.size["D:\es-backups\ES_{DATE}.zip"]
Макрос {DATE} не раскрывается в ключе элемента данных, а раскрывается только в
→ Оповещения и команды, основанные на триггерах
→ Оповещения об обнаружениях
→ Оповещения о авторегистрациях
→ Внутренние оповещения
→ Оповещения обновления проблем
Текущая дата в гггг.мм.дд формате.
Оф. Макросы поддерживаемые по назначению

ТЕКУЩАЯ ДАТА в Элементе данных , макрос в zabbix
Как подставить текущую дату в zabbix в разных форматах

1.Сделать пользовательский макрос {$DATE} дальше что каждый день прописывать дату? не вариант
2.Сделать авто обнаружение файла так же не вариант так как:
Файл будет каждый день новый сравнить размер не получится, после удаления предыдущих файлов сработает триггер на старые файлы что нет данных, можно конечно выставить удаление через 0 дней если не обнаруживается сразу удалился, если файла нет то и проверка не создастся и мы ничего не узнаем.
Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

3.Подставлять дату через API доступ в базу получать ее например с php или командой.
API Zabbix через Bash и Curl



Готовый скрипт Проверяет существует ли глобальный макрос если нет создает проверяет совпадает ли текущая дата если нет изменяет на текущую.
/usr/local/share/zabbix/externalscripts/dateglobalmacroapi.sh Имя-узла

Скачать
Шаблон скрипт dateglobalmacroapi.zip
Шаблон скрипт dateglobalmacroapi.zip
(4.09 КБ) 11 скачиваний
Шаблон можно закрепить у узлу заббикс сервер так как макросы глобальные, если макросы уровня узла то шаблон к узлам крепим.
Шаблон запускает скрипт, при ошибках траппер скидывает данные об ошибке и срабатывает триггер.

dateglobalmacroapi.sh

Код: Выделить всё

#!/bin/bash

#2022/01/15 v2.0
# Автор Мамзиков Артём Андреевич Описание по скрипту https://diyit.ru/viewtopic.php?t=1938

# Входные атрибуты для отправки информации об ошибке
HOSTCONN=$1

#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111' # Или localhost 127.0.0.1
zabbixUsername='Admin'
zabbixPassword='zabbix'
#Конец пользовательских переменных
#***********************************************************************

header='Content-Type:application/json-rpc'
zabbixApiUrl="http://$zabbixServer/zabbix/api_jsonrpc.php"

function exit_with_error() {
  echo '**********************************'
  echo "$errorMessage"
  echo '----------------------------------'
  echo 'Сформированная Команда выполнения'
  echo '----------------------------------'
  echo  curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl
  echo '----------------------------------'
  echo 'Выходные данные'
  echo '----------------------------------'
  echo "$result"
  echo '**********************************'
  zabbix_sender -z $zabbixServer -p 10051 -s "${HOSTCONN}" -k dateglobmacerror -o "ERROR $errorMessage Команда выполнения: curl --silent --show-error --insecure --header $header --data $json $zabbixApiUrl Результат $result"
}


#------------------------------------------------------
# Аутентификация пользователя. https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/login
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить токен авторизации Zabbix'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\"},\"id\": 1 }`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
auth=$(echo "${result}" |sed -e 's|.*result":"||' -e 's/","id.*//g')
check=$(echo "${auth}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&exit 1 ; fi
echo "Вход в систему выполнен успешно - Идентификатор авторизации: $auth"
errorMessage="";json="";result="";check="" # Очистка переменных


function outapi(){
#------------------------------------------------------
# Выход из zabbix https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/logout
#------------------------------------------------------
# Выполнение выхода из API.
errorMessage='*ERROR* - Не удалось выйти из системы'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.logout\",\"params\": [],\"id\": 1, \"auth\": \"$auth\"}`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
logout=$(echo "${result}" |sed -e 's|.*result":||' -e 's/,"id.*//g')
check=$(echo "${logout}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo 'Успешно вышел из Zabbix' "${logout}"
errorMessage="";json="";result="";check="" # Очистка переменных
exit 1
}


# Запрос информации об авторизовавшемся пользователе
#usinfo=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\",\"userData\": true},\"id\": 1 }`
#infouser=`curl --silent --show-error --insecure --header $header --data "$usinfo" $zabbixApiUrl`
#echo "${infouser}"


# Создаваемые и проверяемые глобальные макросы (пишем через , без пробелов между ними экранируем \$)
globmacros="{\$DATE},{\$DATER},{\$DATEYYYY},{\$DATEYYYYMMDD}"


# Формирование фильтра запроса глоб.макросов. Подставим и экранируем \" для Curl
apifiltr=`echo $globmacros|sed -e 's/{/\\"{/g' -e 's/}/}\\"/g'`


#------------------------------------------------------
# Получение глобальных макросов. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить выбранные глобальные макросы Zabbix'
json=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.get\",\"params\":{\"output\": [\"macro\",\"value\"],\"globalmacro\": true ,\"filter\": {\"macro\": [$apifiltr]}},\"auth\": \"$auth\",\"id\": 1})
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
echo "Отображение существующих глобальны макросов даты": $result
proverka="${result}"
#dateglobmac=`echo $proverka|sed 's|.*result:||'|sed 's/,id.*//g'` # Выберем глобальные макросы даты
errorMessage="";json="";result="";check="" # Очистка переменных

# Сгенерируем фильтр для проверки макроса и создания если нет, делим через ,
IFS=',' read -ra sumdir < <(echo "${globmacros}")
# Печать разделенной строки
for sverka in "${sumdir[@]}"
do
case $proverka in
	*"${sverka}"*)
	echo "Макрос Найден" "${sverka}"
	;;
	*)
	echo "Макрос Не найден Создаём" "${sverka}"
	#------------------------------------------------------
	# Создание глобального макроса. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/createglobal
	#------------------------------------------------------
	errorMessage='*ERROR* - Не удается изменить значение глобального макроса Zabbix'
	json=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.createglobal\",\"params\":{\"macro\": \"$sverka\",\"value\": \"test\"},\"auth\": \"$auth\",\"id\": 1})
	result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
	check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
	if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
	echo "Изменение даты в глобальном макросе" $result
	errorMessage="";json="";result="";check="" # Очистка переменных
	;;
esac

# Зададим соответствие даты к макросы
case $sverka in
	{\$DATE})
	DATE=`date +"%Y.%m.%d"` # Получаем переменную текущей даты гггг.мм.дд
	;;
	{\$DATER})
	DATE=`date +"%d.%m.%Y"` # Текущая дата дд.мм.гггг
	;;
	{\$DATEYYYY})
	DATE=`date +"%Y"`   # Текущая дата гггг
	;;
	{\$DATEYYYYMMDD})
	DATE=`date +"%Y%m%d"` # текущая дата ггггммдд
	;;
	*)
	echo "Соответствие макроса к дате Не найдено" "${sverka}"
	zabbix_sender -z $zabbixServer -p 10051 -s "${HOSTCONN}" -k dateglobmacerror -o "ERROR Соответствие макроса к дате Не найдено $sverka "
esac

# Проверим дату и обновим если дата отличается
znacenie=`echo $proverka|sed 's|.*'$sverka'","value":"||'|sed 's/"}.*//g'` # Выберем дату для конкретного макроса
idglobalmacro=`echo $proverka|sed 's|","macro":"'$sverka'.*||'|sed 's/.*"globalmacroid":"//g'` # Для обновление нужно знать ID макроса выберм его

if [ "$DATE" != "$znacenie" ]; then
echo "не совпадает дата" $DATE  $znacenie

#------------------------------------------------------
# Обновление глобального макроса. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/updateglobal
#------------------------------------------------------
errorMessage='*ERROR* - Не удается изменить значение глобального макроса Zabbix'
json=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.updateglobal\",\"params\":{\"globalmacroid\": \"$idglobalmacro\",\"value\": \"$DATE\"},\"auth\": \"$auth\",\"id\": 1})
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
echo "Изменение даты в глобальном макросе" $result
errorMessage="";json="";result="";check="" # Очистка переменных

fi
done

outapi # Запустим блок Выхода

выполнении скрипта dateglobalmacroapi.sh Элементы и триггер
выполнении скрипта dateglobalmacroapi.sh Элементы и триггер
Пример ошибки не правильный пароль.
выполнении скрипта dateglobalmacroapi.sh Пример ошибок
выполнении скрипта dateglobalmacroapi.sh Пример ошибок
Создание тестирование через API
Показать

Код: Выделить всё

#!/bin/bash
# Тестовая версия 1

#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111'
zabbixUsername='Admin'
zabbixPassword='zabbix'
#Конец пользовательских переменных
#***********************************************************************

header='Content-Type:application/json-rpc'
zabbixApiUrl="http://$zabbixServer/zabbix/api_jsonrpc.php"

function exit_with_error() {
  echo '********************************'
  echo "$errorMessage"
  echo '--------------------------------'
  echo 'Входные данные'
  echo '--------------------------------'
  echo "$json" $zabbixApiUrl $usexit
  echo '--------------------------------'
  echo 'Выходные данные'
  echo '--------------------------------'
  echo "$result" "${logout}"
  echo '********************************'
  exit 1
}

#------------------------------------------------------
# Аутентификация пользователя. https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/login
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить токен авторизации Zabbix'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\"},\"id\": 1 }`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
auth=$(echo "${result}" |sed -e 's|.*result":"||' -e 's/","id.*//g')
check=$(echo "${auth}"|tr -d '\r\n'| sed -n 's/error.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo "Вход в систему выполнен успешно - Идентификатор авторизации: $auth"

#------------------------------------------------------
# Получение глобального макроса. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить ID глобального макроса Zabbix'
getglobmacro=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.get\",\"params\":{\"output\": \"extend\",\"globalmacro\": true},\"auth\": \"$auth\",\"id\": 1})
macrocglobget=`curl --silent --show-error --insecure --header $header --data "$getglobmacro" $zabbixApiUrl`
echo "Изменение даты в глобальном макросе $macrocglobget"



DATE=`date +"%Y.%m.%d"` # Получаем переменную текущей даты гггг.мм.дд
#------------------------------------------------------
# Создание глобального макроса. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/createglobal
#------------------------------------------------------
errorMessage='*ERROR* - Не удается изменить значение глобального макроса Zabbix'
globmacro=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.updateglobal\",\"params\":{\"globalmacroid\": \"3\",\"value\": \"$DATE\"},\"auth\": \"$auth\",\"id\": 1})
macrocglob=`curl --silent --show-error --insecure --header $header --data "$globmacro" $zabbixApiUrl`
echo "Изменение даты в глобальном макросе $macrocglob"


#------------------------------------------------------
# Выход из zabbix https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/logout
#------------------------------------------------------
# Выполнение выхода из API.
errorMessage='*ERROR* - Не удалось выйти из системы'
usexit=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.logout\",\"params\": [],\"id\": 1, \"auth\": \"$auth\"}`
logout=`curl --silent --show-error --insecure --header $header --data "$usexit" $zabbixApiUrl`
check=$(echo "${logout}"|tr -d '\r\n'| sed -n 's/error.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo 'Успешно вышел из Zabbix' "${logout}"
Авторизуемся получим токен аунтификации
curl --silent --show-error --insecure --header 'Content-Type: application/json-rpc' --data '{"jsonrpc": "2.0","method":"user.login","params":{"user": "Admin","password": "zabbix"},"id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php

Ответ: {"jsonrpc":"2.0","result":"e56692223b1ec39702106d8155b7de74","id":1}

Запрос Глобальных Макросов
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "usermacro.get","params": {"output": "extend","globalmacro": true },"auth":"e56692223b1ec39702106d8155b7de74", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{"jsonrpc":"2.0","result":[{"globalmacroid":"2","macro":"{$SNMP_COMMUNITY}","value":"public"},{"globalmacroid":"13","macro":"{$DATE}","value":"2022.01.14"},{"globalmacroid":"14","macro":"{$DATEYYYYMMDD}","value":"20220114"}],"id":1}

Запрос с фильтром только макрос {$DATE}
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "usermacro.get","params": {"output": "extend","globalmacro": true ,"filter": {"macro": "{$DATE}"}},"auth":"e56692223b1ec39702106d8155b7de74", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{"jsonrpc":"2.0","result":[{"globalmacroid":"13","macro":"{$DATE}","value":"2022.01.14"}],"id":1}

Запрос с фильтром только макрос {$DATE} и вывод без value только globalmacroid и macro
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "usermacro.get","params": {"output": ["macro"],"globalmacro": true ,"filter": {"macro": "{$DATE}"}},"auth":"e56692223b1ec39702106d8155b7de74", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{"jsonrpc":"2.0","result":[{"globalmacroid":"13","macro":"{$DATE}"}],"id":1}

Запрос с фильтром только макрос {$DATE} и вывод без macro только globalmacroid и value
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "usermacro.get","params": {"output": ["value"],"globalmacro": true ,"filter": {"macro": "{$DATE}"}},"auth":"e56692223b1ec39702106d8155b7de74", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{"jsonrpc":"2.0","result":[{"globalmacroid":"13","value":"2022.01.14"}],"id":1}

Запрос с фильтром только макрос {$DATE} и вывод "macro","value"
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "usermacro.get","params": {"output": ["macro","value"],"globalmacro": true ,"filter": {"macro": "{$DATE}"}},"auth":"e56692223b1ec39702106d8155b7de74", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{"jsonrpc":"2.0","result":[{"globalmacroid":"13","macro":"{$DATE}","value":"2022.01.14"}],"id":1}

Запрос с фильтром макросов "{$DATE}","{$DATEYYYYMMDD}"
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "usermacro.get","params": {"output": ["macro","value"],"globalmacro": true ,"filter": {"macro": ["{$DATE}","{$DATEYYYYMMDD}"]}},"auth":"e56692223b1ec39702106d8155b7de74", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{"jsonrpc":"2.0","result":[{"globalmacroid":"4","macro":"{$DATEYYYYMMDD}","value":"20220109"},{"globalmacroid":"3","macro":"{$DATE}","value":"2022.01.13"}],"id":1}



Создание макроса {$DATER} значение 1
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "usermacro.createglobal","params":{"macro": "{$DATER}","value": "1"},"auth": "e56692223b1ec39702106d8155b7de74","id": 1}' http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{"jsonrpc":"2.0","result":{"globalmacroids":["5"]},"id":1}

Выход из API
curl --silent --show-error --insecure --header 'Content-Type: application/json-rpc' --data '{"jsonrpc": "2.0","method":"user.logout","params": [],"id": 1, "auth": "e56692223b1ec39702106d8155b7de74"}' http://192.168.175.111/zabbix/api_jsonrpc.php
4.Сделать проверку элемента Через внешний скрипт в элементе прописать команду даты которая будет раскрывается в скрипте
или же запускать команду прямо через заббикс агент ключом system.run (ключ в ключе попробовать с раскрытием даты в команде)
Скачать пример Шаблон + скрипт
Пример файлов папок с датой.zip
Пример файлов папок с датой.zip
(3.22 КБ) 14 скачиваний
Пример шаблона проверка через сеть
Файловых серверов Проверки через сеть.zip
Файловых серверов Проверки через сеть.zip
(1.97 КБ) 11 скачиваний
Скачиваем скрипт ложим его на заббикс сервер в моем случае путь такой
/usr/local/share/zabbix/externalscripts
Посмотреть примеры
Показать
Так выглядит ключ изначально
zabbix_get -s 192.168.175.8 -k vfs.file.exists["D:\es-backups\ES_{DATE}.zip"] - не раскрывается дата

Команда прилетает на Хост Windows
zabbix_get -s 192.168.175.8 -k system.run["dir /a-d /B D:\%date:~6,4%.zip"] - имя архива текущий год, не работает так как запятая делить команду и не экранируется получаем команду со стороны узла dir /a-d /B D:\%date:~6
Попытка раскрыть дату еще на сервере Linux
zabbix_get -s 192.168.175.8 -k system.run["dir /a-d /B D:\date +"%Y".zip"] - с разными вариантами кавычек так же не вариант

Внешняя проверка
dir-file-date.sh[{HOST.CONN},{$HOST.PORTS},vfs.file.exists["D:\"${DATEYYYY}".zip"]
Элемент данных с датой внешняя проверка
Элемент данных с датой внешняя проверка
Пример Элемента данных:
Имя: Наличие файла ES_{$DATE}.zip
Тип: Внешняя проверка
Ключ: dir-file-date.sh[{HOST.CONN},{$HOST.PORTS},vfs.file.exists["D:\es-backups\ES_${DATE}.zip"]
Тип информации: Числовой (целое положительное)
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
1 - файл найден
0 - файл не найден
Активировано: V

Если перед переменой у нас идет слеш \$ выходит что мы экранируем символ $ и это уже будет не переменная
root@ZABBIXSERVER:~# ./dir-file-date.sh 192.168.175.8 10050 'vfs.file.exists D:\${DATEYYYY}.zip'
vfs.file.exists D:$DATEYYYY.zip
root@ZABBIXSERVER:~# ./dir-file-date.sh 192.168.175.8 10050 'vfs.file.exists D:\"${DATEYYYY}".zip'
vfs.file.exists D:$DATEYYYY.zip
root@ZABBIXSERVER:~# ./dir-file-date.sh 192.168.175.8 10050 'vfs.file.exists D:\ ${DATEYYYY}.zip'
vfs.file.exists D: 2021.zip


./dir-file-date.sh 192.168.175.8 10050 'vfs.file.exists["D:\${DATEYYYY}.zip"'
Ответ: 1

./dir-file-date.sh 192.168.175.8 10050 'vfs.file.exists["D:\es-backups\ES_${DATE}.zip"'
BASH: имя переменной из значения другой переменной
Показать
t1=1
t2=t1
t3=$(eval echo \$$t2)
echo $t3
1

t1=1
t2=t1
echo ${!t2}
1

eval echo \$$i
скрипт копируем на заббикс сервер, в моем случае путь такой:
/usr/local/share/zabbix/externalscripts
dir-file-date.sh
Показать
#!/bin/bash
#2021/11/28 v1
# Автор Мамзиков Артём Андреевич
# Подставляем дату в ключ

# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
KEY=$3

# Для теста просмотр входных переменных
STV=$(date "+%F %T")
#echo "${STV}" "${IP}" "${PORT}" "${KEY}" >> /tmp/log-date-dir-file

# Переменные Даты для файлов и папок https://losst.ru/komanda-date-v-linux
DATE=`date +"%Y.%m.%d"`
DATEYYYY=`date +"%Y"`
DATEYYYYMMDD=`date +"%Y%m%d"`


# так как \ у нас экранирует знак переменой $ если она сразу идет сделаем ее подстановочной
SL='\'

# Замена \ на переменную
show=$(echo "${KEY}"| sed 's/\\/"${SL}"/g')

# Раскрытие переменных
#eval varval=\"\$$show\"
eval varval=\"\$show\"
#eval echo "${varval}"
KEYP=$(eval echo "${varval}")
#eval echo \"\$$show\"

# Запрос сформированного ключа
# Так как Многоуровневые массивы параметров, например [a,[b,[c,d]],e], недопускаются. параметр в кавычках разрешена левая квадратная скобка [ , добавим закрывающую правую скобку ] . https://www.zabbix.com/documentation/cu ... s/item/key
zabbix_get -s $IP -p $PORT -k "${KEYP}"]
#echo "${KEYP}"

5. Сделать глобальный макрос и значение даты напрямую подставлять в таблице SQL процедурой каждые цать интервал времени.
Хранятся они в таблице globalmacro - Глобальные Макросы
Глобальные макросы
Глобальные макросы
MySql таблица globalmacro
MySql таблица globalmacro
Запрос MySql текущая дата
Показать
Получение даты и времени
Функции NOW(), SYSDATE(), CURRENT_TIMESTAMP() возвращают текущую локальную дату и время на основе системных часов в виде объекта datetime. Все три функции возвращают одинаковый результат

SELECT NOW(); -- 2018-05-25 21:34:55
SELECT SYSDATE(); -- 2018-05-25 21:34:55
SELECT CURRENT_TIMESTAMP(); -- 2018-05-25 21:32:55
Функции CURDATE и CURRENT_DATE возвращают текущую локальную дату в виде объекта date:

SELECT CURRENT_DATE(); -- 2018-05-25
SELECT CURDATE(); -- 2018-05-25
Функции CURTIME и CURRENT_TIME возвращают текущее время в виде объекта time:

SELECT CURRENT_TIME(); -- 20:47:45
SELECT CURTIME(); -- 20:47:45
UTC_DATE возвращает текущую локальную дату относительно GMT

SELECT UTC_DATE(); -- 2018-05-25
UTC_TIME возвращает текущее локальное время относительно GMT

SELECT UTC_TIME(); -- 17:47:45

Подробнее Функции для работы с датами и временем

Проверка SELECT DATE_SUB(CURDATE(), INTERVAL 3 MONTH); - формата гггг-мм-дд
функция DATE_SUB возвращает дату, после которой вычитается определенный интервал даты/времени. минус 3 месяца
CURDATE возвращает текущую дату
DATE_SUB( date, INTERVAL value unit )
UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 3 MONTH)) - в формате unix
date - дата, на которую должен быть вычтен интервал.
value - значение интервала времени / даты, которое вы хотите вычесть. Вы можете указать положительные и отрицательные значения для этого параметра.
unit - единичный тип интервала, например DAY, MONTH, MINUTE, HOUR и т.д.
не совсем подходит Текущая дата в гггг-мм-дд формате.
SELECT CURRENT_DATE(); 2021-11-27
SELECT CURDATE(); 2021-11-27
Идет через тире
Преобразуем дату
SELECT DATE_FORMAT(CURRENT_DATE(), '%d/%m/%y'); получим 27/11/21
SELECT DATE_FORMAT(CURRENT_DATE(), '%d/%m/%Y'); получим 27/11/2021
SELECT DATE_FORMAT(CURRENT_DATE(), '%Y.%m.%d'); получим 2021.11.27 Текущая дата в гггг.мм.дд формате.
И получаем SQL запрос вида
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%Y.%m.%d') WHERE `globalmacro`.`macro` = '{$DATE}';
Так как у меня дата без точек везде добавим еще один глобальный макрос {$DATEYYYYMMDD}
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%Y%m%d') WHERE `globalmacro`.`macro` = '{$DATEYYYYMMDD}';

Раздельно выводим Год Месяц Число и составляем как нужно
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%Y') WHERE `globalmacro`.`macro` = '{$DATE_YYYY}';
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%m') WHERE `globalmacro`.`macro` = '{$DATE_MM}';
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%d') WHERE `globalmacro`.`macro` = '{$DATE_DD}';

Указать 3 глобальных макроса: {$DATE_YYYY} ; {$DATE_MM} ; {$DATE_DD}

И получаем даты
Глобальные Макросы zabbix с текущей датой
Глобальные Макросы zabbix с текущей датой
Добавим процедуру и событие в MySql для автоматического выполнения команды каждый день в 00:00:00 часов
Процедура и событие
Показать
Выполнение команд от имени администратора root или пользователя с соответствующими правами.

Убедитесь в том, что первый планировщик событий включен значение должно быть ON (Обычно выключен)
SHOW GLOBAL VARIABLES LIKE 'event_scheduler';
Команда включения
SET GLOBAL event_scheduler = ON;

Добавим виде процедуры
USE `zabbixdb`;

DELIMITER $$
--
-- Процедуры
--
DROP PROCEDURE IF EXISTS `Global_Macro_Date`$$
CREATE PROCEDURE `Global_Macro_Date`()
COMMENT 'Текущая дата в глобальный макрос'
BEGIN

UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%Y.%m.%d') WHERE `globalmacro`.`macro` = '{$DATE}';
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%Y%m%d') WHERE `globalmacro`.`macro` = '{$DATEYYYYMMDD}';
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%d.%m.%Y') WHERE `globalmacro`.`macro` = '{$DATEDD.MM.YYYY}';
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%Y') WHERE `globalmacro`.`macro` = '{$DATE_YYYY}';
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%m') WHERE `globalmacro`.`macro` = '{$DATE_MM}';
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%d') WHERE `globalmacro`.`macro` = '{$DATE_DD}';

END$$
DELIMITER ;


Добавим событие для запуска процедуры каждые сутки в 00:00:00 часов
DROP EVENT `Global_Macro_Date`$$
DELIMITER $$
--
-- События
--
CREATE EVENT `Global_Macro_Date`
ON SCHEDULE EVERY 1 DAY STARTS
STARTS '2021-11-28 00:00:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT 'Текущая дата в глобальный макрос'
DO BEGIN
CALL `Global_Macro_Date`();
END$$

DELIMITER ;

Возможно в событии нужно задать пустые приёмные/аргументы для вызова процедуры
SET @p0=''; SET @p1=''; SET @p2=''; CALL `Global_Macro_Date`(@p0, @p1, @p2);
Процедура
Процедура
Событие для процедуры
Событие для процедуры
Либо можно через скрипт sh прописать подключение к базе и выполнение команды через Cron либо из самого заббикса выполнение команды виде элемента данных.
Пример скрипта DateMacroZabbix.sh
Показать
mysql -uroot -pПароль -zabbixdb "UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%Y.%m.%d') WHERE `globalmacro`.`macro` = '{$DATE}';UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), '%Y%m%d') WHERE `globalmacro`.`macro` = '{$DATEYYYYMMDD}';"

И прописываем в крон
5 10 * * * root /etc/cron.d/DateMacroZabbix.sh > /dev/null 2>&1
'@reboot root /etc/cron.d/DateMacroZabbix.sh > /dev/null 2>&1
Так же можно использовать Макросы Шаблон и узлов выбрав таблицу и ID узла или шаблона
hostmacro - Макросы Узлов (Хостов)

Вот так выглядит готовый шаблон
Шаблон Подстановка дат
Шаблон Подстановка дат
Пример последних данных
Пример последних данных
Проверка пути файла Через сеть
Проверка пути файла Через сеть
Проверка пути файла Через сеть
Дата раздельными числами потом можно скомпоновать из 3х макросов как угодно что более удобно, так же номер недели , кол - во дней в месяце и тп.

Как запрашивать Элемент данных в определенное время ? Пользовательские интервалы в Элементах данных
количество слов: 2659
Партнёрская ссылка на Хостинг Beget https://beget.com/p937243
Аватара пользователя
maxi
Гость
Сообщения: 1
Стаж: 2 месяца
Благодарил (а): 2 раза

Шаблон проверки файлов

Сообщение maxi »

Доброго дня.
Отличная статья, спасибо!

Мне нужно мониторить размер файла на каждом из zabbix-клиентов.
Каталог везде одинаковый, но имя файла на каждом клиенте "ИмяХоста.log"
Помогите подставить имя хоста в ключ.
Пробовал так:

Код: Выделить всё

vfs.file.size[x:\papka\{system.hostname}.log]
количество слов: 10
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 548
Стаж: 3 года 9 месяцев
Откуда: Вологодская область
Поблагодарили: 24 раза
Контактная информация:

Шаблон проверки файлов

Сообщение Артём Мамзиков »

maxi,
Макросы
{HOST.CONN} ip или dns узла
{HOST.HOST} имя узла сети то что тебе нужно
{HOST.NAME} - видимое имя узла
количество слов: 9
Партнёрская ссылка на Хостинг Beget https://beget.com/p937243
Ответить Вложения 26 Пред. темаСлед. тема

Вернуться в «Файлы и Папки»