blog_hero_Zabbix in Docker

Zabbix in Docker

Jul 08 2024

Waarom doen we dit?

Zabbix is een ontzettend goede monitoring software en echt een aanrader voor iedere IT'er om op z'n minst eens te proberen. Er zijn echter bepaalde platformen zoals Microsoft Windows Server waar Zabbix niet op werkt.

Niet getreurd! Ook hier is een alternatief beschikbaar. Je kan namelijk in container variant Zabbix draaien. Deze methode zorgt ervoor dat je niet alleen snel en eenvoudig Zabbix kan starten, je kan ook nog eens het doen op een nieuwe waaier van platformen.

Nu alles uitgeklaard is, kunnen we erin vliegen. we gaan een netwerk in Docker opzetten, alle relevante componenten opspinnen met de juiste configuratie en daarnaast gaan we een apart netwerk aanmaken voor een Zabbix Proxy op te zetten. Dat gaat dan kunnen simuleren hoe proxies in het echte leven ook gebruikt kunnen worden: off-site.

De poorten die op het host toestel gekozen zijn, zitten in een range die zullen werken voor zowel Docker en Podman. Specifiek voor die container opstellingen die rootless zouden gaan.

De uitvoering

We maken eerst een netwerk aan waarin we onze core componenten gaan laten verbinden.

docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

Een volgende belangrijke stap is een database aanmaken. Hier kiezen we voor de laatste versie van MySQL. In principe kan je hier ook PostgreSQL kiezen. We moeten hier vooral de nodige variabelen meegeven zodat MySQL blijft werken. Vooral MYSQL_DATABASE, MYSQL_USER en MYSQL_PASSWORD zijn heel relevant. We geven met -v ook een map mee die gebruikt zal worden in de container voor de database zelf op te slaan. Specifiek voor Zabbix moeten we ook nog de character set en collation meegeven.

docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" -e MYSQL_ROOT_PASSWORD="root_pwd" \
-v /var/lib/mysql:/var/lib/mysql:Z \
--network=zabbix-net --restart unless-stopped -d mysql \
--character-set-server=utf8 --collation-server=utf8_bin \

Een volgende component is de Zabbix Java Gateway. Die is optioneel en enkel relevant als je Java applicaties plant te monitoren. Deze heeft niet veel nodig en moet vooral in het juiste netwerk bestaan.

docker run --name zabbix-java-gateway -t \
--network=zabbix-net \
--restart unless-stopped \
-d zabbix/zabbix-java-gateway:alpine-7.0-latest

Ook het volgende component is enkel relevant als je SNMP traps plant te ontvangen. Hier gaan we ook een paar mappen meegeven waarin één van de mappen gebruikt wordt om de ontvangen traps op te slaan en de andere om eventuele MIBs te voorzien.

docker run --name zabbix-snmptraps -t \
-v /var/lib/zbx_instance/snmptraps:/var/lib/zabbix/snmptraps:rw \
-v /var/lib/zbx_instance/mibs:/usr/share/snmp/mibs:ro \
--network=zabbix-net \
-p 1162:1162/udp \
--restart unless-stopped \
-d zabbix/zabbix-snmptraps:alpine-7.0-latest

Nu zijn we eindelijk gekomen aan de Zabbix server. Hier geven we heel wat opties mee. We lopen er even door:

  • DB_SERVER_HOST: Dit is een verwijzing naar onze MySQL container. geef hier de naam in die we eerder gebruikt hadden.
  • MYSQL_DATABASE, MYSQL_USER en MYSQL_PASSWORD moeten ook overeenkomen met de settings die we eerder al hadden geconfigureerd.
  • ZBX_ALLOWUNSUPPORTEDDBVERSIONS: Dit is een configuratie om ondersteuning met MySQL 9 toe te staan. Officieel is deze nog niet ondersteund en dus zou dit best niet in productie gebruik worden. Voor onze test omgeving is dit geen probleem.
  • ZBX_JAVAGATEWAY: Hiermee kunnen deze container linken aan onze Zabbix server.
  • ZBX_ENABLE_SNMP_TRAPS en --volumes-from: Anders dan bij de Zabbix Java Gateway, heeft Zabbix server enkel toegang nodig naar de fysieke volumes van de Zabbix SNMP trapper.
  • -p: Hier hebben we 11051 gekozen als poort voor Zabbix trapper process. Vooral om aan te tonen dat Zabbix ook met andere poorten werkt.
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
-e ZBX_ENABLE_SNMP_TRAPS="true" \
-e ZBX_ALLOWUNSUPPORTEDDBVERSIONS=1 \
--network=zabbix-net \
-p 11051:10051 \
--volumes-from zabbix-snmptraps \
--restart unless-stopped \
-d zabbix/zabbix-server-mysql:alpine-7.0-latest

Nu de Zabbix server draait, moeten we de ook nog een manier hebben om de configuratie aan te passen en de data te weergeven. Hier komt de Zabbix web container naar boven. Deze moet uiteraard verbinden met hetzelfde netwerk en ook dezelfde database als de Zabbix Server. Hier kiezen we om poort 8080, opnieuw voor compabiliteit voor rootless containers.

docker run --name zabbix-web-nginx-mysql -t \
-e ZBX_SERVER_HOST="zabbix-server-mysql" \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--network=zabbix-net \
-p 8080:8080 \
--restart unless-stopped \
-d zabbix/zabbix-web-nginx-mysql:alpine-7.0-latest

De proxy in een apart netwerk

Omdat we het graag een beetje uitdagender maken en real-life situaties simuleren, heb ik hier gekozen om de proxy in een apart netwerk te steken. Deze stap is uiteraard optioneel maar wel relevant als je proxy op andere fysieke locaties wilt testen.

De proxy moet hier uiteraard naar de Zabbix Server kunnen verbinden. Omdat we de modus van de Zabbix proxy niet meegeven, gaat die standaard in Active mode starten en wilt die dus zelf verbinding maken met de Zabbix server. We kunnen dat configureren door ZBX_SERVER_HOST in te stellen.

Met containers is dat niet altijd duidelijk naar welk IP-adres we willen verbinden maar we kunnen wel iets anders gebruiker om de verbinding mogelijk te maken. Voor Docker kunnen we host.docker.internal gebruiken als een soort localhost adres. Bij Podman is dat host.containers.internal.

Hier gebruik ik een Zabbix Proxy met SQLite3. Dat is in de meeste gevallen de meest interessante optie om als database backend te gebruiken.

docker network create --subnet 172.19.0.0/16 --ip-range 172.19.240.0/20 zabbix-proxy
docker run --name some-zabbix-proxy-sqlite3 --init -d \
-e -e ZBX_HOSTNAME=remote-proxy
-e ZBX_SERVER_HOST=host.containers.internal:11051 \
--network=zabbix-proxy \
-p 11055:10051 \
zabbix/zabbix-proxy-sqlite3:latest

De agent

Om ons verhaal goed af te maken, gaan we natuurlijk ook een agent installeren in het netwerk van de proxy. Daar horen nog een paar opties bij. Op moment van schrijven is 6.4 nog de laatste versie van de Zabbix Agent beschikbaar.

docker run --name some-zabbix-agent -e ZBX_HOSTNAME="my-agent" \
-e ZBX_SERVER_HOST=host.containers.internal -e ZBX_SERVER_PORT=11055 \
--network=zabbix-proxy \
--init -d zabbix/zabbix-agent2:latest

Nu naar de webinterface

Als je goed gevolgd hebt, zijn alle containers actief. Dat betekent ook dat de Zabbix web interface beschikbaar moet zijn op localhost. Je kan daar nu aanmelden met de standaard logingegevens: Admin / zabbix

Onder Administration -> Proxies kan je nu een nieuwe Proxy aanmaken. Het belangrijkste is hier is de juiste naam (ZBX_HOSTNAME) in te geven en ook de mode op active laten staan. Als je de proxy goed toegevoegd hebt, staat de status op Online, version op 7.0.0.

Nu de Proxy in orde is, kunnen we de agent ook toevoegen. Dit doen we onder Data collection -> Hosts. Hier moeten we een paar gegevens ingeven om dit werkende te krijgen:

  • Host name (ZBX_HOSTNAME)
  • Host groups (Linux servers)
  • Proxy (remote-proxy)
  • Templates (Linux by Zabbix agent active)

Proficiat!

Je hebt nu een werkende Zabbix installatie! Nu kan je beginnen met alles te monitoren. Dus voeg nieuwe hosts toe, link templates en exploreer. Dit is een uitstekend moment om eens na te gaan welke de nieuwe features zijn in Zabbix 7.0. Weet je hier niet goed? Dan is hier een cheat sheet.