Оф. Поддерживаемые ключи элементов данных
Некоторые из ключей, что можно мониторить из коробки.
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).
Файл Лог
log[файл,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<вывод>,<максзадержка>] - Мониторинг файлов журналов (логов). Журнал (лог).
log.count[файл,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<максзадержка>] - Подсчёт количества совпадающих строк в мониторинге файла журнала (логов). Целое число.
logrt[файл_regexp,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<вывод>,<максзадержка>,<опции>] - Мониторинг файлов журналов (логов) с поддержкой ротации логов. Журнал (лог).
logrt.count[файл_regexp,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<максзадержка>,<опции>] - Подсчёт количества совпадающих строк в мониторинге файла журнала (логов) с поддержкой ротации логов. Целое число.
СКАЧАТЬ О Веб проверке в данном шаблоне Тут
Если при проверке Элемент данных выдает нет доступа к директории permission denied или путь не найден NOT_FOUND
1. Проверить путь и наличие файла возможно экранирование пути и \
2. Не хватает прав на папки (путь) на сам файл.
Решение: Выдать необходимые права или Сменить пользователя от которого работает Заббикс Агент
Windows в Службе заббикс агента
в Linux пример Запуск Zabbix Agent от Root
3. В конфигурации Заббикс Агента начиная с Zabbix 5.0 system.run
Удаленные команды по-прежнему отключены по умолчанию, но в новых конфигурационных файлах, которые выражаются с помощью нового параметра DenyKey (DenyKey=system.run[*]) черный список, разрешить все AllowKey=system.run[*].
Удаленные команды можно включить, удалив (или закомментировав) ключ DenyKey=system.run[*]
Либо настроить разрешения для определённых путей
Подробнее в оф.
Ранее этот параметр был EnableRemoteCommands = 1, иначе агент не сможет принимать команды.
Параметр EnableRemoteCommands теперь устарел.
Более подробно Поддержка черных и белых списков для метрик на стороне агента
Создание удаление копий на неделю 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 неделю, там так же проверяется что архив не битый архивация прошла успешно размер отличается от предыдущего не более чем на * %.
ЭЛЕМЕНТЫ ДАННЫХ Имя: Время изменения свойств файла 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
Проверка Копии на ФС уже в архиве с датой
реализовано в 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.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 # Запустим блок Выхода
Код: Выделить всё
#!/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
или же запускать команду прямо через заббикс агент ключом system.run (ключ в ключе попробовать с раскрытием даты в команде)
Скачать пример Шаблон + скрипт Пример шаблона проверка через сеть Скачиваем скрипт ложим его на заббикс сервер в моем случае путь такой
/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"'
t2=t1
t3=$(eval echo \$$t2)
echo $t3
1
t1=1
t2=t1
echo ${!t2}
1
eval echo \$$i
/usr/local/share/zabbix/externalscripts
#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 - Глобальные Макросы
Функции 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}
И получаем даты Для времени
SELECT TIME_FORMAT(CURRENT_TIME (),'%H');
SELECT TIME_FORMAT(CURRENT_TIME(),'%i');
SELECT TIME_FORMAT(CURRENT_TIME(),'%S');
Global_Macro_Time
BEGIN
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME (),'%H') WHERE `globalmacro`.`macro` = '{$TIME_HH}';
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME(),'%i') WHERE `globalmacro`.`macro` = '{$TIME_MM}';
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME(),'%S') WHERE `globalmacro`.`macro` = '{$TIME_SS}';
END
Добавим процедуру и событие в MySql для автоматического выполнения команды каждый день в 00:00:00 часов
Убедитесь в том, что первый планировщик событий включен значение должно быть 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(), '%y') WHERE `globalmacro`.`macro` = '{$DATE_YY}';
-- Текущий Месяц формат ММ
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}';
-- Номер недели в текущем месяце
UPDATE `globalmacro` SET `value` = WEEK(CURDATE(),1)-WEEK(DATE_FORMAT(CURRENT_DATE(),'%Y-%m-01'),1)+1 WHERE `globalmacro`.`macro` = '{$WEEK_NUMBER_MONTH}';
-- Номер дня недели (1-ПН)
UPDATE `globalmacro` SET `value` = WEEKDAY(CURDATE())+1 WHERE `globalmacro`.`macro` = '{$WEEK_DAY}';
-- Количество дней в текущем месяце
UPDATE `globalmacro` SET `value` =DAY(LAST_DAY(CURDATE())) WHERE `globalmacro`.`macro` = '{$DAYS_CURRENT_MONTH}';
-- Количество дней в предыдущем месяце
UPDATE `globalmacro` SET `value` =DAYOFMONTH(LAST_DAY(NOW() - INTERVAL 1 MONTH)) WHERE `globalmacro`.`macro` = '{$NUM_DAYS_PREV_MONTH}';
-- Количеством секунд в предыдущем месяце, прибавляя 10800 секунд (3 часа)
UPDATE `globalmacro` SET `value` =DAYOFMONTH(LAST_DAY(NOW() - INTERVAL 1 MONTH)) * 24 * 60 * 60 + 10800 WHERE `globalmacro`.`macro` = '{$TRIG_SECONDS_PREV_MONTH}';
-- Минус 1 день из даты
UPDATE `globalmacro` SET `value` = LPAD(DAY(DATE_SUB(CURDATE(), INTERVAL 1 DAY)), 2, '0') WHERE `globalmacro`.`macro` = '{$DATE_DD_1DAY}';
UPDATE `globalmacro` SET `value` = LPAD(MONTH(DATE_SUB(CURDATE(), INTERVAL 1 DAY)), 2, '0') WHERE `globalmacro`.`macro` = '{$DATE_MM_1DAY}';
UPDATE `globalmacro` SET `value` = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) WHERE `globalmacro`.`macro` = '{$DATE_YYYY_1DAY}';
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);
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME (),'%H') WHERE `globalmacro`.`macro` = '{$TIME_HH}';
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME(),'%i') WHERE `globalmacro`.`macro` = '{$TIME_MM}';
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME(),'%S') WHERE `globalmacro`.`macro` = '{$TIME_SS}';
Либо можно через скрипт sh прописать подключение к базе и выполнение команды через Cron либо из самого заббикса выполнение команды виде элемента данных.
И прописываем в крон
5 10 * * * root /etc/cron.d/DateMacroZabbix.sh > /dev/null 2>&1
'@reboot root /etc/cron.d/DateMacroZabbix.sh > /dev/null 2>&1
hostmacro - Макросы Узлов (Хостов)
Вот так выглядит готовый шаблон Проверка пути файла Через сеть Дата раздельными числами потом можно скомпоновать из 3х макросов как угодно что более удобно, так же номер недели , кол - во дней в месяце и тп.
Как запрашивать Элемент данных в определенное время ? Пользовательские интервалы в Элементах данных