Настроить Zabbix-агента на использование сценария. Для этого в файле /etc/zabbix/zabbix_agentd.conf задать параметр UserParameter:
### Option: UserParameter
# User-defined parameter to monitor. There can be several user-defined parameters.
# Format: UserParameter=<key>,<shell command>
# See 'zabbix_agentd' directory for examples.
#
# Mandatory: no
# Default:
# UserParameter=
UserParameter=iostat[*],/etc/zabbix/scripts/iostat.sh "none" "$1" "$2"
Значение параметра UserParameter состоит из частей: - /etc/zabbix/scripts/iostat.sh "none" "$1" "$2" – команда с аргументами. Запускается Zabbix-агентом для получения данных; - [*] – означает, что Zabbix-сервер передаёт аргументы для запускаемой программы; - iostat – название ключа. Используется Zabbix-сервером как ссылка на команду /etc/zabbix/scripts/iostat.sh.
Перезапустить Zabbix-агента для вступления настроек в силу:
sudo systemctl restart zabbix-agent
Настройка Zabbix-сервера
На локальном компьютере создать файл iostat_template.xml.
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>6.0</version>
<date>2025-03-18T13:22:13Z</date>
<groups>
<group>
<uuid>23b4cb78db6e4cd194f3600a0006af6c</uuid>
<name>MyTemplates</name>
</group>
</groups>
<templates>
<template>
<uuid>753644a41edb4dcaa1d110cd93e90242</uuid>
<template>Performance Metrics</template>
<name>Performance Metrics</name>
<groups>
<group>
<name>MyTemplates</name>
</group>
</groups>
<discovery_rules>
<discovery_rule>
<uuid>daaeac93f1244836b063034061377c00</uuid>
<name>IOSTAT: Hard disk drive discovery</name>
<key>iostat[]</key>
<delay>60s</delay>
<lifetime>1d</lifetime>
<item_prototypes>
<item_prototype>
<uuid>0bb6bf63770a4630a0389c3122739325</uuid>
<name>Доля объединенных запросов на чтение (от всех запросов на чтение)</name>
<key>iostat[%rrqm,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>Процент</units>
</item_prototype>
<item_prototype>
<uuid>c9ad769abab54a08b95d2ce74c1fec8e</uuid>
<name>Процент времени, в течение которого диск был занят выполнением запросов</name>
<key>iostat[%util,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>Процент</units>
</item_prototype>
<item_prototype>
<uuid>348df69b695b4a3cb1ff02311c9d050e</uuid>
<name>Доля объединенных запросов на запись (от всех запросов на запись).</name>
<key>iostat[%wrqm,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>Процент</units>
</item_prototype>
<item_prototype>
<uuid>9d546f3a7a5b4ea7b31153690bd71b3f</uuid>
<name>Среднее количество активных (ожидающих выполнения) операций.</name>
<key>iostat[aqu-sz,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>number</units>
</item_prototype>
<item_prototype>
<uuid>17edea89307740ce83f8f0366db87cb1</uuid>
<name>Количество операций удаления (discard) в секунду (актуально для SSD).</name>
<key>iostat[d/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ops/s</units>
</item_prototype>
<item_prototype>
<uuid>b7bbda24b9e74a2597070790214e4388</uuid>
<name>Средний размер запроса на удаление.</name>
<key>iostat[dareq-sz,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>kBytes</units>
</item_prototype>
<item_prototype>
<uuid>792ea57a779e4298befa1f205191d12f</uuid>
<name>Количество данных, удаляемых в секунду</name>
<key>iostat[dkB/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>kBytes</units>
</item_prototype>
<item_prototype>
<uuid>1f79c62da23c4ac6b766242e379aae42</uuid>
<name>Количество объединенных (merged) запросов на удаление в секунду</name>
<key>iostat[drqm/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ops/s</units>
</item_prototype>
<item_prototype>
<uuid>b9ae57862ad341df9066fae0455bc457</uuid>
<name>Среднее время ожидания операции удаления</name>
<key>iostat[d_await,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ms</units>
</item_prototype>
<item_prototype>
<uuid>31d99d98afec4f808071708d9ad309c4</uuid>
<name>Количество операций принудительного сброса кеша (flush) в секунду</name>
<key>iostat[f/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ops/s</units>
</item_prototype>
<item_prototype>
<uuid>f39804e082d34f67b1bc1d8a41ec1cad</uuid>
<name>Среднее время ожидания операции flush.</name>
<key>iostat[f_await,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ms</units>
</item_prototype>
<item_prototype>
<uuid>b1e754be49d4453185d3bfae0b2c20e0</uuid>
<name>Количество операций чтения в секунду</name>
<key>iostat[r/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ops/s</units>
<description>Скорость чтения килобайт в секунду</description>
</item_prototype>
<item_prototype>
<uuid>88db077435e441c6936fcfac82da91b0</uuid>
<name>Средний размер запроса на чтение.</name>
<key>iostat[rareq-sz,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>kBytes</units>
</item_prototype>
<item_prototype>
<uuid>089779fb67e34c63bdbd8b256983c24d</uuid>
<name>Объем данных, читаемых с диска</name>
<key>iostat[rkB/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>kBytes/s</units>
</item_prototype>
<item_prototype>
<uuid>0f1149f20cc14d4bb6d39e7d8749b8be</uuid>
<name>Количество объединенных (merged) запросов</name>
<key>iostat[rrqm/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ops/s</units>
</item_prototype>
<item_prototype>
<uuid>6a62aa51da90454aa78d2f783a8e231f</uuid>
<name>Среднее время ожидания операции чтения</name>
<key>iostat[r_await,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ms</units>
<description>Время задержки на чтение</description>
</item_prototype>
<item_prototype>
<uuid>dec7a67b116448d298b88d9618e929cb</uuid>
<name>Количество операций записи в секунду</name>
<key>iostat[w/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ops/s</units>
</item_prototype>
<item_prototype>
<uuid>b4ca236fad94413e947c2fe8f58f4305</uuid>
<name>Средний размер запроса на запись</name>
<key>iostat[wareq-sz,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>kBytes</units>
</item_prototype>
<item_prototype>
<uuid>5016437f0c804a80bf261681dc5135cc</uuid>
<name>Объем данных, записываемых на диск.</name>
<key>iostat[wkB/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
</item_prototype>
<item_prototype>
<uuid>fd59e2645c36415ca3a435f180a07e89</uuid>
<name>Количество объединенных (merged) запросов на запись</name>
<key>iostat[wrqm/s,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ops</units>
</item_prototype>
<item_prototype>
<uuid>b790d46d0c564a57b1b666d75285865e</uuid>
<name>Среднее время ожидания операции записи</name>
<key>iostat[w_await,{#HDNAME}]</key>
<delay>30s</delay>
<value_type>FLOAT</value_type>
<units>ms</units>
<description>Время ожидания на запись</description>
</item_prototype>
</item_prototypes>
<graph_prototypes>
<graph_prototype>
<uuid>0391be4240e04a8f97e7bc50a25300b7</uuid>
<name>Average Ask Size</name>
<graph_items>
<graph_item>
<color>1A7C11</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[wareq-sz,{#HDNAME}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>1</sortorder>
<color>274482</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[dareq-sz,{#HDNAME}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<color>F63100</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[rareq-sz,{#HDNAME}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
<graph_prototype>
<uuid>47d0189c82d24e69995b4e30e53e1f48</uuid>
<name>Data volume Read/Write</name>
<graph_items>
<graph_item>
<color>1A7C11</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[wkB/s,{#HDNAME}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>1</sortorder>
<color>274482</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[rkB/s,{#HDNAME}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
<graph_prototype>
<uuid>6d0413c48295437fb494b7d7a2916237</uuid>
<name>Disk Latency</name>
<graph_items>
<graph_item>
<color>1A7C11</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[w_await,{#HDNAME}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>1</sortorder>
<color>274482</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[d_await,{#HDNAME}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<color>F63100</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[r_await,{#HDNAME}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
<graph_prototype>
<uuid>2dee0215de194ae7ba017b68d044dd64</uuid>
<name>Read/Write speed</name>
<graph_items>
<graph_item>
<color>1A7C11</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[dkB/s,{#HDNAME}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>1</sortorder>
<color>274482</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[w/s,{#HDNAME}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<color>F63100</color>
<calc_fnc>ALL</calc_fnc>
<item>
<host>Performance Metrics</host>
<key>iostat[r/s,{#HDNAME}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
</graph_prototypes>
</discovery_rule>
</discovery_rules>
</template>
</templates>
</zabbix_export>
Файл содержит шаблон с описанием параметров дисковых накопителей. Zabbix-сервер использует шаблон для получения данных от Zabbix-агента.
На Zabbix-сервере шаблон будет называться "Performance Metrics" и состоять в группе шаблонов "MyTemplates".
В веб-интерфейсе Zabbix-сервера настроить получение данных от Zabbix-агента:
Загрузить шаблон отчёта.
Для этого в главном меню выбрать пункт "Сбор данных → Шаблоны". Откроется страница: На странице справа вверху нажать на кнопку "Импорт".
Откроется окно: В окне нажать на кнопку "Выберите файл" и выбрать на локальном компьютере файл с шаблоном iostat_template.xml. Нажать на кнопку "Импорт".
Откроется окно с шаблоном: Нажать на кнопку "Импорт".
Окно закроется. Вверху страницы отобразится сообщение "Импортировано успешно".
Добавить узел, на котором установлен Zabbix-агент для сбора данных о работе дисковых накопителей.
Для этого в главном меню выбрать пункт "Мониторинг → Узлы сети". Откроется страница: На странице справа вверху нажать на кнопку "Создать узел сети".
Откроется окно: В окне заполнить поля: - "Имя узла сети" – ввести имя узла, на котором установлен Zabbix-агент; - "Шаблоны" – выбрать шаблон "Performance Metrics" из группы шаблонов "MyTemplates"; - "Группы узлов сети" – выбрать "Linux servers"; - "Интерфейсы" – справа внизу от поля нажать на "Добавить"; выбрать из раскрывшегося меню пункт "Агент"; в появившейся строке "Агент" в поле "IP адрес" ввести адрес узла, на котором установлен Zabbix-агент. В правом нижнем углу окна нажать на кнопку "Добавить".
Окно закроется. Вверху страницы отобразится сообщение "Узел сети добавлен".
Просмотр данных о работе дисковых накопителей в веб-интерфейсе Zabbix-сервера
В веб-интерфейсе Zabbix-сервера в главном меню выбрать пункт "Мониторинг → Узлы сети".
Откроется страница: В таблице в строке с узлом, на котором настроен сбор данных Zabbix-агентом, нажатьна "Последние данные".
Откроется страница с данными о работе дисковых накопителей узла:
Возможные проблемы и способы их решения
В Веб-интерфейсе в выводимых данных о работе накопителей может появиться проблема с отображением символов. Возможно, эту проблему устранит настройка Zabbix-агента, разрешающая использование небезопасных символов в аргументах команды.
Для этого в файле настроек Zabbix-агента /etc/zabbix/zabbix_agentd.conf необходимо параметру UnsafeUserParameters присвоить значение 1:
### Option: UnsafeUserParameters
# Allow all characters to be passed in arguments to user-defined parameters.
# The following characters are not allowed:
# \ ' " ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @
# Additionally, newline characters are not allowed.
# 0 - do not allow
# 1 - allow
#
# Mandatory: no
# Range: 0-1
# Default:
# UnsafeUserParameters=0
UnsafeUserParameters=1
Вместо ручной настройки Zabbix-агента, описанной в разделе "Настройка Zabbix-агента", можно использовать сценарий автоматической настройки.
Для этого на узле, на котором работает Zabbix-агент:
Разместить в одном и том же каталоге сценарий сбора данных iostat.sh и сценарий автоматической настройки агентаiostat-agent-plugin-install.sh. Содержимое файла iostat.sh приведено в разделе "Настройка Zabbix-агента".
#!/bin/bash
ZABBIX_CONF="/etc/zabbix/zabbix_agentd.conf"
#Проверка, выполняется ли скрипт с правами sudo
if [ "$(id -u)" -ne 0 ]; then
echo -e "Этот скрипт должен быть запущен с правами sudo.\nЗапустите меня так: sudo ./iostat-agent-plugin-install.sh\nВыхожу."
exit 1
fi
# Обновление репозиториев
apt update >/dev/null 2>&1 || echo "Кажется что то с репозиториями, проверьте их!" && exit 1
# Установка пакетов
apt install sysstat zabbix-agent -y >/dev/null 2>&1 || echo "Похоже что-то не так с установкой, поставьте вручную: sudo apt install zabbix-agent sysstat -y" && exit 1
# Копирование скрипта
echo "Кладу скрипт агента в /etc/zabbix/scripts/iostat.sh"
mkdir /etc/zabbix/scripts/
mv ./iostat.sh /etc/zabbix/scripts/iostat.sh
# Установка прав на скрипт
echo "Поправлю права на скрипт, должно быть '-rwxr-x---(750) root zabbix'"
chmod 750 /etc/zabbix/scripts/iostat.sh
chown root:zabbix /etc/zabbix/scripts/iostat.sh
chmod +x /etc/zabbix/scripts/iostat.sh
# Проверка прав
ls -ld /etc/zabbix/scripts/iostat.sh
echo "UserParameter=iostat[*],/etc/zabbix/scripts/iostat.sh "none" "$1" "$2"" | tee /etc/zabbix/zabbix_agentd.conf
# Проверяем наличие строки UnsafeUserParameters и её значение
if grep -Eq '^#?\s*UnsafeUserParameters\s*=\s*(0|[^1])' "$ZABBIX_CONF"; then
# Если строка закомментирована или значение не 1, то приводим её к UnsafeUserParameters=1
echo "Настрою параметр UnsafeUserParameters на 1 в $ZABBIX_CONF"
# Используем sed для замены или добавления строки
sed -i 's/^#*\s*UnsafeUserParameters\s*=.*/UnsafeUserParameters=1/' "$ZABBIX_CONF"
# Перезапуск Zabbix агент
systemctl restart zabbix-agent
echo "Zabbix агент перезапущен с изменениями."
else
echo "Параметр UnsafeUserParameters не найден, добавляю в конец файла."
echo "UnsafeUserParameters=1" | tee -a "$ZABBIX_CONF"
systemctl restart zabbix-agent
fi