Автоматизация 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 обеспечит актуальность метрик в системе мониторинга.

    Часто задаваемые вопросы