Docker containers monitoring in Zabbix

В Интернет я нашёл готовый вариант для расширенного мониторинга контейнеров Docker в Zabbix, который c помощью программы на С позволяет получать через Zabbix-агента такие данные, как статус конкретного контейнера, используемые им ресурсы системы, сетевые характеристики и многое другое. Более того, весь функционал упакован в отдельный контейнер и не зависит от окружения (MonitoringArtist). Мне же необходима была базовая информация от Zabbix-агента, установленного на хост-машине, без лишних сообщений (сигналов) и оповещений. Например, статус конкретного контейнера, время его работы, когда был создан и т.п. Что-то подобное, реализованное на Python, я нашёл здесь, но решил сделать свой скрипт на bash.

Предполагается, что zabbix-agent уже установлен на хост-машину с операционной системой Debian и запущен.
Если папки /etc/zabbix/scripts/ нет, создадим её:
debian$ sudo mkdir /etc/zabbix/scripts

Bash-скрипт для получения информации о существующих контейнерах и их статусах с помощью команды docker ps: /etc/zabbix/scripts/docker.sh

#!/bin/bash

if [ $2 = "id" ]; then
  /usr/bin/docker ps -a | grep $1 | awk 'BEGIN {FS = " +"}; END''{print $1}'
elif [ $2 = "image" ]; then
  /usr/bin/docker ps -a | grep $1 | awk 'BEGIN {FS = " +"}; END''{print $2}'
elif [ $2 = "created" ]; then
  /usr/bin/docker ps -a | grep $1 | awk 'BEGIN {FS = " +"}; END''{print $4}'
elif [ $2 = "status" ]; then
  /usr/bin/docker ps -a | grep $1 | awk 'BEGIN {FS = " +"; STATUS = 0}; {if ($5 ~ "Up") STATUS = 1}; END''{print STATUS}'
elif [ $2 = "uptime" ]; then
  /usr/bin/docker ps -a | grep $1 | awk 'BEGIN {FS = " +"}; END''{print $5}'
elif [ $2 = "ports" ]; then
  /usr/bin/docker ps -a | grep $1 | awk 'BEGIN {FS = " +"}; {if (length($7) == 0) PORTS = "No ports set"; else PORTS = $6}; END''{print PORTS}'
elif [ $2 = "name" ]; then
  /usr/bin/docker ps -a | grep $1 | awk 'BEGIN {FS = " +"}; {if (length($7) == 0) NAME = $6; else NAME = $7}; END''{print NAME}'
elif [ $2 = "ip" ]; then
  CONTAINER_NAME=$(/usr/bin/docker ps -a | grep $1 | awk 'BEGIN {FS = " +"}; {if (length($7) == 0) NAME = $6; else NAME = $7}; END''{print NAME}')
  docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER_NAME
fi

Для того, чтобы он был исполняемым, дадим ему необходимые права доступа и добавим пользователя zabbix в группу docker:
debian$ sudo chmod 755 /etc/zabbix/scripts/docker.sh
debian$ sudo gpasswd --add zabbix docker
или
debian$ sudo usermod -aG docker zabbix

Теперь добавим дополнительные пользовательские настройки в конфигурацию Zabbix агента: /etc/zabbix/zabbix_agentd.d/userparameter_docker.conf

UserParameter=docker.id[*],/etc/zabbix/scripts/docker.sh $1 id
UserParameter=docker.image[*],/etc/zabbix/scripts/docker.sh $1 image
UserParameter=docker.created[*],/etc/zabbix/scripts/docker.sh $1 created
UserParameter=docker.status[*],/etc/zabbix/scripts/docker.sh $1 status
UserParameter=docker.uptime[*],/etc/zabbix/scripts/docker.sh $1 uptime
UserParameter=docker.ports[*],/etc/zabbix/scripts/docker.sh $1 ports
UserParameter=docker.name[*],/etc/zabbix/scripts/docker.sh $1 name
UserParameter=docker.ip[*],/etc/zabbix/scripts/docker.sh $1 ip

Перезагрузим zabbix-agent:
debian$ sudo service zabbix-agent restart

Для проверки нашей пользовательской конфигурации Zabbix агента, можно использовать программу zabbix-get:
debian$ zabbix_get -s localhost -k docker.status[nginx]
Проверьте, чтобы в основной конфигурации Zabbix агента (/etc/zabbix/zabbix-agent.conf) было прописано Server=localhost, иначе агент скажет, что у вас не достаточно прав:
zabbix_get [7326]: Check access restrictions in Zabbix agent configuration

Остаётся только добавить шаблон в Zabbix сервер, в котором для примера добавлены сообщения и триггер для nginx контейнера: zbx_export_docker.zip

Проверено для версий операционной системы и программного обеспечения:
Debian stretch 9.4
Docker 17.12.1-ce
Zabbix 3.4

P.S. Возможно, я также упакую этот инструментарий в контейнер и буду мониторить сокет контейнеров Docker на хост-машине, который проброшу внутрь него. Может даже напишу мануал по использованию и залью всё на GitHub, но это будет уже другая статья.

Обсуждение закрыто.