11 октября 2020

Обновление плагина Zabbix на Grafana 7 для ARM.


На Raspberry Pi 3 у меня накручена хитрая система из Zabbix, libzbxmodbus и Grafana с плагинами. Эдакий автономный регистратор параметров по шине modbus.

С первыми тремя пунктами проблем пока нет, а вот с четвёртым появились после обновления плагина Zabbix до версии 4.0.
 
Раньше этот плагин был чисто на скриптах и работал без изменения практически на любой платформе, но в 4-й версии у плагина появилась программа-backend для ускорения работы, увеличения безопасности и прочих плюшек. Задумка хорошая, но проблема в том, что в пакете с сайта бинарная сборка только под 64-битные системы Linux, Windows и Darwin/MacOS да еще и без подписи. То есть после обновления у меня ничего не заработало.

Если не работает релиз, то будем собирать из исходников сами. Благо, что всё необходимое есть в репозитории на GitHub. Даже инструкция есть, но она немного неточная.

Для сборки нужны два компонента: NodeJS LTS и компилятор языка Go.

Установка NodeJS LTS из репозиториев описана в этой инструкции.

Теперь о неточности. Ставить yarn вручную не надо, потому что для этой программы тоже есть готовый репозиторий.
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install yarn
Для установки компиляторя языка Go нужно скачать архив для архитектуры ARM со страницы загрузки.

Я распаковал архив в каталог "/opt" и прописал переменные окружения в файле "/etc/profile.d/golang.sh":
export GOROOT=/opt/go
export GOPATH=$HOME/go
export PATH=${PATH}:${GOROOT}/bin
export PATH=${PATH}:${GOPATH}/bin
Теперь по инструкции необходимо склонировать репозиторий с исходными текстами и всё собрать.
git clone https://github.com/alexanderzobnin/grafana-zabbix
cd grafana-zabbix
yarn install --pure-lockfile
yarn build
# Или просто запустить make
make
Если оперативной памяти хватит, то всё соберётся, но работать опять же не будет. У меня на Raspberry Pi 3 сборка завершалась ошибкой по причине недостатка памяти, на Raspberry Pi 4 с 4 гигабайтами всё собралось.

Работать не будет, потому что бинарник-backend всё равно собрался под amd64, но под нужную платформу можно собрать вручную следующими командами:

go mod vendor
# ARMv5 (Raspberry Pi 1)
env GOOS=linux GOARCH=arm GOARM=5 go build -mod=vendor -o ./dist/zabbix-plugin_linux_arm ./pkg
# ARMv7 (Raspberry Pi 2 и выше)
env GOOS=linux GOARCH=arm GOARM=7 go build -mod=vendor -o ./dist/zabbix-plugin_linux_arm ./pkg
# ARMv8 (Raspberry Pi 3 и выше)
env GOOS=linux GOARCH=arm64 go build -mod=vendor -o ./dist/zabbix-plugin_linux_arm ./pkg
Теперь содержимое каталога "dist" необходимо перенести в "/var/lib/grafana/plugins/alexanderzobnin-zabbix-app" и прописать в файле "/etc/grafana/grafana.ini" параметр для разрешения загрузки неподписанных плагинов:
[plugins]
...
allow_loading_unsigned_plugins = alexanderzobnin-zabbix-app,alexanderzobnin-zabbix-datasource
Теперь надо перезапустить Grafana и убедиться, что "zabbix-plugin_linux_arm" есть в списке процессов, а в Grafana источник данных "Zabbix" не отмечен неизестным.