Автоматизация curl POST запроса с base64 и отправкой в Zabbix
При работе с внешними API часто возникает задача: отправить POST запрос, получить ответ в формате XML, закодированный в base64, декодировать его и передать метрики в систему мониторинга Zabbix. В этой статье мы разберём, как написать shell-скрипт для полной автоматизации этого процесса с помощью curl, base64 и zabbix_sender.
Общая схема автоматизации
Процесс состоит из трёх этапов: отправка запроса и получение ответа, декодирование и парсинг XML, отправка данных в Zabbix. Для автоматизации удобно использовать bash-скрипт, который можно запускать по расписанию через cron или встроенный планировщик Zabbix.
1. Отправка POST запроса через curl
Для отправки запроса используйте утилиту curl с флагами -X POST (метод), -H (заголовки), -d (тело запроса). Ответ, содержащий base64, сохраните в переменную или временный файл.
RESPONSE=$(curl -s -X POST https://api.example.com/endpoint \
-H 'Content-Type: application/json' \
-d '{"key":"value"}')Если ответ приходит в виде XML, где base64 находится внутри тега, используйте grep или sed для извлечения строки.
2. Декодирование base64 и парсинг XML
Для декодирования base64 в Linux используйте команду base64 -d. Полученный XML можно обработать стандартными средствами: xmllint или xmlstarlet.
DECODED=$(echo "$RESPONSE" | base64 -d)
VALUE=$(echo "$DECODED" | xmllint --xpath 'string(/root/metric)' -)Если XML содержит несколько значений, извлеките каждое в отдельную переменную.
3. Отправка данных в Zabbix
Для передачи метрик в Zabbix используйте утилиту zabbix_sender. Она отправляет данные напрямую серверу или прокси.
zabbix_sender -z 127.0.0.1 -p 10051 -s "HostName" -k "metric.key" -o "$VALUE"Параметры: -z - адрес Zabbix сервера, -p - порт (обычно 10051), -s - имя хоста в Zabbix, -k - ключ элемента данных, -o - значение.
Полный bash-скрипт для автоматизации
Соберите все шаги в один исполняемый файл:
#!/bin/bash
# Шаг 1: Отправка POST запроса
RESPONSE=$(curl -s -X POST https://api.example.com/endpoint \
-H 'Content-Type: application/json' \
-d '{"param":"test"}')
# Шаг 2: Извлечение base64 из XML (пример)
BASE64_STR=$(echo "$RESPONSE" | grep -oP '(?<=).*?(?=)')
# Шаг 3: Декодирование
DECODED_XML=$(echo "$BASE64_STR" | base64 -d)
# Шаг 4: Извлечение метрики из XML
METRIC=$(echo "$DECODED_XML" | xmllint --xpath 'string(//value)' -)
# Шаг 5: Отправка в Zabbix
zabbix_sender -z zabbix.server.com -p 10051 -s "MyHost" -k "custom.metric" -o "$METRIC"Не забудьте сделать скрипт исполняемым: chmod +x script.sh.
Настройка Zabbix для приёма данных
На стороне Zabbix создайте элемент данных (item) с типом «Zabbix trapper» и ключом, совпадающим с указанным в скрипте (например, custom.metric). Тип информации выберите в зависимости от метрики (числовой, символьный). Для автоматического сбора добавьте скрипт в cron:
*/5 * * * * /path/to/script.shОбработка ошибок и логирование
Для надёжной работы добавьте проверку: если curl вернул ошибку или декодирование не удалось, скрипт должен записать лог и не отправлять пустые данные.
if [ -z "$METRIC" ]; then
echo "$(date): Ошибка получения метрики" >> /var/log/script.log
exit 1
fiИспользуйте set -e в начале скрипта для автоматического завершения при ошибке.
Заключение
Автоматизация отправки POST запроса, декодирования base64 и передачи данных в Zabbix - типичная задача интеграции. Предложенный bash-скрипт легко адаптировать под любой API: достаточно изменить URL, заголовки и XPath для извлечения значений. Регулярный запуск через cron обеспечит актуальность метрик в системе мониторинга.