Files
Blog/posts/24-07-08-ZabbixInDocker.md
2024-07-08 18:54:50 +02:00

111 lines
6.5 KiB
Markdown

---
title: "Zabbix in Docker"
excerpt: "De beste monitoring software op ieder platform"
date: "2024-07-08T21:00:00.000Z"
author: Eli Winderickx
hero_image: /cover_ZabbixInDocker.png
category: Zabbix,Docker,Intro,Installatie
---
## 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.
```bash
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.
```bash
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.
```bash
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.
```bash
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.
```bash
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.
```bash
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.
```bash
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 ZBX_SERVER_HOST=host.containers.internal:11051 \
--network=zabbix-proxy \
-p 11055:10051 \
zabbix/zabbix-proxy-sqlite3:latest
```