Вопрос или проблема
У меня есть следующий скрипт:
#!/bin/bash
echo "{"
echo "\"data\":["
grep -hoR server_name.* /etc/nginx/sites-enabled/|sed 's/[^ ]* //'|sed 's/.$//'|awk -F"https://serverfault.com/" '{ print "{\"{#URL}\":\""$1"\"}," }'| head -c -2
echo "]"
echo "}"
Это настроено как UserParameter на клиенте
UserParameter=url.discovery[*],/etc/zabbix/scripts/urls.sh
и дает результаты такие как
{
"data":[
{"{#URL}":"example.com"}]
}
Затем у меня настроено правило обнаружения в Zabbix следующим образом:
Ключ – url.discovery[*]
Прототип элемента – web.page.regexp[{#URL},,,test,,]
Однако я получаю следующую ошибку:
Ошибка: значение должно быть объектом JSON
Я проверил JSON-результат на https://jsonlint.com/, и он говорит, что он действителен.
Как я могу это решить?
Спасибо
Стюарт
Наверное, это проблема Zabbix – https://support.zabbix.com/browse/ZBX-12195
Ответ или решение
Ошибку "Value should be a JSON object" в Zabbix может вызывать несколько факторов, связанных с форматом возвращаемых данных от вашего скрипта и настройками Zabbix. Давайте рассмотрим возможные причины проблемы и способы их устранения.
Шаг 1: Проверка формата JSON
Ваш скрипт должен возвращать корректный JSON-объект. Сначала убедитесь, что ваш скрипт возвращает данные в правильном формате. Попробуйте запустить его вручную и убедитесь, что результат действительно выглядит следующим образом:
{
"data": [
{"{#URL}": "example.com"},
{"{#URL}": "another-example.com"}
]
}
Шаг 2: Отладка скрипта
Убедитесь, что ваш скрипт действительно генерирует выходные данные без лишних символов, таких как пробелы или неразрывные символы, которые могут не видны при обычном просмотре. Вы можете использовать команду cat -A
для просмотра всех символов, включая невидимые:
cat -A /etc/zabbix/scripts/urls.sh
Шаг 3: Изменение скрипта
Ваш скрипт немного сложен. Вы можете упростить его как ниже, чтобы избежать возможных ошибок:
#!/bin/bash
echo '{"data":['
grep -hoR 'server_name.*' /etc/nginx/sites-enabled/ | \
sed 's/[^ ]* //' | \
sed 's/.$//' | \
awk -F"https://serverfault.com/" '{ print "{\"{#URL}\":\""$1"\"}," }' | \
sed '$ s/,$//'
echo ']}'
Обратите внимание, что я добавил sed '$ s/,$//'
для удаления последней запятой перед закрывающей фигурной скобкой ]
.
Шаг 4: Настройка Zabbix
После того, как вы убедились, что JSON-выход вашей команды корректен, вам нужно убедиться, что в Zabbix настроены правильные правила по обнаружению. Проверьте следующее:
- Убедитесь, что ключ
url.discovery[*]
правильно настроен в Zabbix и соответствует вашему скрипту. - Проверьте, что у вас действительно настроен "Item Prototype" с правильным форматом
web.page.regexp[{#URL},,,test,,]
.
Шаг 5: Проверка прав доступа и логов
Если ошибка всё ещё возникает, проверьте права доступа к вашему скрипту и логи Zabbix:
- Убедитесь, что пользователь, под которым работает Zabbix, имеет права на исполнение вашего скрипта.
- Ознакомьтесь с логами Zabbix (
/var/log/zabbix/zabbix_agentd.log
), чтобы увидеть, нет ли там других указаний на ошибку.
Шаг 6: Обновление и поддержки
Если ни одно из вышеуказанных решений не помогло, возможно, проблема связана с устаревшей версией Zabbix. Проверьте последнюю версию Zabbix и, при необходимости, обновите систему. Вы также можете обратиться к поддержке Zabbix, предоставив им все детали конфигурации и логи для более глубокого анализа.
Таким образом, следуя этим шагам, вы сможете диагностировать и исправить ошибку "Value should be a JSON object" в Zabbix. Если у вас остались вопросы, не стесняйтесь задавать их!