Folytatom a zabbix szerver bemutatását. A korábbi demó környezetemben beállt némi változás. Port ütközés miatt át kellett költöztetnem a zabbixot egy másik VM-be, így a 192.168.5.250-es IP cím megváltozott erre: 192.168.56.7. Mivel számomra is új dolog volt a zabbix agent konténerben való futtatása, elmesélem, milyen tapasztalatokat szereztem vele.
A docker környezetet a legegyszerűbben egy kiherélt virtuális géphez lehetne hasonlítani, ahol a futó alkalmazás nem érzékel semmit a környezetéből, azaz az őt futtató szerverből. Ami tulajdonképpen az egyik előnye a dockernek, itt és most, ebben a környezetben hátrány, mert a zabbix szerver a konténeres zabbix agenttől soha sem fogja megtudni, hogy mennyi processz fut a host serveren.
Megmutatom, mire gondolok. Felvettem a hostot natív agenttel (vcos7a néven, 172.17.0.1 IP címmel) és egy konténeres agenttel (Zabbix server néven, zabbix-agent host névvel) is. A 172.17.0.1 egy speciális IP cím, ez a docker hálózat alapértelmezett IP címe, a telepített agentet ezen futtatom.
Így néz ki a módosított topológiám:
Csak egy IP cím változott, illetve beírtam a legutóbb lemaradt „node1” nevet, valamint felvettem egy másik szervert is (vdeb11).
A fentebb említett processzek most így néznek ki a zabbixban:
Ha ugyanígy beállítjátok Ti is, el lehet menteni a „Save as” gombbal, és akkor lesz egy fix szűrőtök (több is lehet). De a lényeg, a telepített, „hagyományos” zabbix agent 281 futó processzt mutat, a konténeres agent pedig csak 6 darabot, ami csak az agent 6 processze. Meg lehet nézni ezzel a paranccsal:
$ sudo docker top zabbix-agent
UID PID PPID C STIME TTY TIME CMD
1997 25302 25245 0 Jul27 ? 00:00:06 /sbin/tini -- /usr/bin/docker-entrypoint.sh /usr/
sbin/zabbix_agentd --foreground -c /etc/zabbix/zabbix_agentd.conf
1997 25457 25302 0 Jul27 ? 00:00:00 /usr/sbin/zabbix_agentd --foreground -c /etc/zabb
ix/zabbix_agentd.conf
1997 25601 25457 0 Jul27 ? 00:00:16 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
1997 25602 25457 0 Jul27 ? 00:00:12 /usr/sbin/zabbix_agentd: listener #1 [waiting for
connection]
1997 25603 25457 0 Jul27 ? 00:00:12 /usr/sbin/zabbix_agentd: listener #2 [waiting for
connection]
1997 25604 25457 0 Jul27 ? 00:00:12 /usr/sbin/zabbix_agentd: listener #3 [waiting for
connection]
Ezt elvileg ki lehet kerülni a „privileged móddal„, de ez a tesztjeim szerint ugyanúgy nem mutatja a host szerver processzeit, viszont ütünk egy jó nagy rést a rendszerünkbe. Szóval, ha nem a demó a célunk, használjunk telepített agenteket.
zabbix agent(ek) telepítése a szervereinkre
Munkám során többféle Linux disztribúcióval találkozom (a teljesség igénye nélkül: Red Hat, CentOS, Rocky, Alma, Debian, Ubuntu, Fedora, Alpine, Zentyal, Zorin, stb), és jó ideje mindre elérhető csomagból a zabbix minden komponense. Az most részletkérdés, hogy milyen verzióban.
Szóval az általunk használt disztribúció csomagkezelőjével telepítsük fel az agentet, valahogy így:
$ sudo yum install zabbix-agent -y
vagy
$ sudo apt install zabbix-agent -y
Van olyan OS, ahol automatikusan el is indul, a többségnél ezt kézzel kell megtenni:
$ sudo systemctl enable --now zabbix-agent
az agent(ek) beállítása
Gyárilag úgy van elő konfigurálva az agent, hogy azt feltételezi, hogy a zabbix szerver ugyanazon a gépen fut (localhost/127.0.0.1). Ez legfeljebb azon a szerveren megfelelő, ahol a zabbix szerver is fut. De a többség nem ilyen gép, illetve nekünk konténerben fut a zabbix szerver, tehát minden agentnél be kell állítani az zabbix szerverünk IP címét, ami az én demó környezetemben 192.168.56.7.
Ha eltekintünk a rengeteg kommenttől, ennyi paraméter bőven elég egy zabbix-agent.conf-ba (ez a vcos7a nevű VM, CentOS 7-el):
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=192.168.151.2
ListenIP=172.17.0.1
Hostname=vcos7a
Ez pedig egy debian 11-es agent konfigja (vdeb11 névvel):
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix-agent/zabbix_agentd.log
LogFileSize=0
Server=192.168.56.7
ListenIP=0.0.0.0
Hostname=vdeb11
A PidFile
és a LogFile
oprendszer szintű különbség, ezzel nem kell foglalkoznunk, a Hostname
adja magát. Ami viszont fontos difi, az a Server
és a ListenIP
paraméter.
Az összes monitorozandó szerveren 192.168.56.7
-es IP-t kell beállítani a Server
paraméternek. ListenIP
-nek pedig a „0.0.0.0
„-t, ami kb annyit tesz, hogy minden létező hálókártyán figyelni fog az agent.
Az egyetlen kivétel az a szerver, ahol a zabbix szerver fut konténerben. Ennél felesleges kitenni az agentet, tegyük a default docker hálózati kártyára (172.17.0.1
). És a végére hagytam a leg izgibb paramétert, a Server
-t. Ha egy teremben oktatnék, megkérdeznék tőletek, hogy ki tudja, miért 192.168.151.2 a zabbix-server IP címe? Nos, nem egy teremben oktatok, inkább elárulom. Ez is a docker miatt szükséges. A korábbi cikkemben közölt docker-compose.yml fájlban nem volt semmi, ami a hálózatot szabályozta volna, ezért minden indításkor más IP tartományt kapott a zabbix a dockertől. Ez kimondottan kerülendő, ha az agent statikus IP-vel vagy host névvel dolgozik 🙁
Én azt az utat választottam, hogy létrehozok egy dedikált hálózatot a zabbix konténereknek, majd minden konténer kap egy-egy statikus IP címet. Íme a módosított docker-compose.yml fájlom:
version: "3"
volumes:
DB:
services:
zabbix-server:
container_name: zabbix-server
image: zabbix/zabbix-server-mysql:alpine-6.4-latest
volumes:
- /etc/localtime:/etc/localtime:ro
ports:
- 10051:10051
restart: always
environment:
- DB_SERVER_HOST=zabbix-db
- DB_SERVER_PORT=3306
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=P@G*LCxUAU96L5oq
- ZBX_STARTPINGERS=3
- ZBX_LISTENPORT=10051
networks:
customnetwork:
ipv4_address: 192.168.151.2
zabbix-web:
container_name: zabbix-web
image: zabbix/zabbix-web-apache-mysql:alpine-6.4-latest
volumes:
- /etc/localtime:/etc/localtime:ro
- ./web/apache.conf:/etc/apache2/conf.d/apache.conf
- ./web/php.ini:/etc/php81/conf.d/php.ini
ports:
- 888:8080
restart: always
environment:
- DB_SERVER_HOST=zabbix-db
- DB_SERVER_PORT=3306
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=P@G*LCxUAU96L5oq
- ZBX_SERVER_HOST=zabbix-server
- ZBX_SERVER_PORT=10051
- ZBX_SERVER_NAME=vcos7a.vagrant.lan
- PHP_TZ=Europe/Budapest
networks:
customnetwork:
ipv4_address: 192.168.151.3
zabbix-db:
container_name: zabbix-db
image: mariadb:10.6
volumes:
- DB:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
command: mysqld --collation-server=utf8mb4_bin
restart: always
environment:
- MYSQL_ROOT_PASSWORD=xQdr0iORWI8ZEY1F
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=P@G*LCxUAU96L5oq
networks:
customnetwork:
ipv4_address: 192.168.151.4
networks:
customnetwork:
ipam:
config:
- subnet: 192.168.151.0/24
Indítás, leállítás a szokásos módon:
Start: $ sudo docker-compose up -d
Stop: $ sudo docker-compose down
)
Fontos! A szerverünkön, vagy bárhol a hálózatunkban ne legyen használatban a 192.168.151.0/24-es hálózati tartomány, különben módosítanunk kell a címeket!
Álljunk meg egy szóra, nekem már van demó környezetem (4 különböző OS-el)
Aki nem olvasta volna, írtam összesen 6 cikket vagrant, majd ansible témában, aminek az lett a vége, hogy a 4 VM-re felkerültek a beállított zabbix-agentek 🙂
Aki fel szeretne zárkózni, olvassa el ezeket a cikkeket: vagrant1, vagrant2, vagrant3, ansible1, ansible2, ansible3.
A topológiát átalakítottam, dobtam a vdeb11-et, a vm4 is Debian11 alapú. És felvettem a VM1-VM3 szervereket az ábrára. Sőt, ha már szerepel a rajzon egy router, akkor azt is bevonom a monitorozásba.
Az SMTP szervert is a valós helyére helyeztem el, egy Cseh adatközpontban fut, bár az IP címe alapján nem tűnne fel, ez úgy lehetséges, hogy a kinti szerverem és az itthoni hálózatom közt van egy VPN kapcsolat létrehozva, így az SMTP szervert is elérem belső címmel.
Vegyük elő a zabbix weboldalunkat, és aktualizáljuk a hostjainkat:
Házi feladat, miért piros a 4 új VM?
Aki elolvasta a belinkelt 6 cikket, az már tudja, hogy a zabbix agent-et konfiguráló playbook-ban a zabbix szerver IP címe: 192.168.5.250. Ez az én prod zabbix szerverem címe, amit nem szeretnék szétbarmolni a demonstráció kedvéért, valamint a verziója is régebbi, a legújabb LTS, azaz 6.0.19.
Módosítsuk az ansible-ben az IP címet a demó szerverére, vegyük elő az inventory/group_vars/all.yml fájlunkat:
ZBXSERVER: '192.168.56.7'
ZBXLOGFILESIZE: '50'
ZBXAGENTPORT: '10050'
ZBXLISTENIP: '0.0.0.0'
És futtassuk le a 4 VM-re a playbookot:
$ ansible-playbook playbook/install-zabbix-agent.yml -l servers
Ez lett a kimenete:
PLAY [all] *****************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [vm3]
ok: [vm1]
ok: [vm2]
ok: [vm4]
TASK [Zabbix Agent telepítése [Red Hat family]] *****************************************************************************
skipping: [vm3]
skipping: [vm4]
ok: [vm1]
ok: [vm2]
TASK [Zabbix Agent telepítése [Debian family]] *****************************************************************************
skipping: [vm1]
skipping: [vm2]
ok: [vm3]
ok: [vm4]
TASK [Zabbix Agent konfigurálása] *****************************************************************************
--- before: /etc/zabbix/zabbix_agentd.conf
+++ after: /home/msandor/.ansible/tmp/ansible-local-19549587x2sz34h/tmp_olecudj/zabbix_agentd.conf.j2
@@ -12,7 +12,7 @@
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix-agent/zabbix_agentd.log
LogFileSize=50
-Server=192.168.5.250
+Server=192.168.56.7
ListenPort=10050
ListenIP=0.0.0.0
ServerActive=127.0.0.1
changed: [vm3]
--- before: /etc/zabbix_agentd.conf
+++ after: /home/msandor/.ansible/tmp/ansible-local-19549587x2sz34h/tmp6sxgnf59/zabbix_agentd.conf.j2
@@ -12,7 +12,7 @@
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=50
-Server=192.168.5.250
+Server=192.168.56.7
ListenPort=10050
ListenIP=0.0.0.0
ServerActive=127.0.0.1
changed: [vm1]
--- before: /etc/zabbix_agentd.conf
+++ after: /home/msandor/.ansible/tmp/ansible-local-19549587x2sz34h/tmprbpofpb0/zabbix_agentd.conf.j2
@@ -12,7 +12,7 @@
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=50
-Server=192.168.5.250
+Server=192.168.56.7
ListenPort=10050
ListenIP=0.0.0.0
ServerActive=127.0.0.1
changed: [vm2]
--- before: /etc/zabbix/zabbix_agentd.conf
+++ after: /home/msandor/.ansible/tmp/ansible-local-19549587x2sz34h/tmpjtugt3ch/zabbix_agentd.conf.j2
@@ -12,7 +12,7 @@
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix-agent/zabbix_agentd.log
LogFileSize=50
-Server=192.168.5.250
+Server=192.168.56.7
ListenPort=10050
ListenIP=0.0.0.0
ServerActive=127.0.0.1
changed: [vm4]
TASK [Zabbix Agent engedélyezése és elindítása] *****************************************************************************
ok: [vm2]
ok: [vm1]
ok: [vm3]
ok: [vm4]
RUNNING HANDLER [restart zabbix-agent] *****************************************************************************
changed: [vm3]
changed: [vm1]
changed: [vm2]
changed: [vm4]
PLAY RECAP *****************************************************************************
vm1 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
vm2 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
vm3 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
vm4 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Várjunk egy percet, és frissítsük a zabbix-ban a host-okat mutató oldalt:
Nincs itt semmi meglepetés, minden bezöldült. Talán korábban nem említettem, az Availability
oszlop alatti szürke ikon azt jelenti, hogy nem zabbix agent-tel monitorozzuk az eszközt, a zöld ikon azt jelenti, hogy zabbix agent-tel monitorozzuk az eszközt, és elérhető az agent, a piros ikon azt jelenti, hogy zabbix agent-tel monitorozzuk az eszközt, viszont nem elérhető az agent. Ha jó az agent konfig, akkor hálózati hiba lehet a dologban, esetleg tűzfal a problémás szerveren. Alapértelmezetten a 10050/tcp portot kell elérnie a szervernek.
Mit lehet még tudni az agentről?
A server <-> agent kapcsolata lehet aktív, vagy passzív. Aktív esetben az agent kapcsolódik a szerverhez, az agentnek nem kell portot nyitni, vannak olyan szituációk, amikor ez a megoldás. Én eddig csak passzív módot használtam, ott a szerver szólítja meg az agentet, így az agent portjának elérhetőnek kell lennie a szerver felől nézve. Ha passzív módot használunk, nem kell a konfigba a ServerActive=127.0.0.1
sor, ki is lehet kommentelni. Én kitöröltem a playbook template fájlból. Nem fog loggolni, hogy nem tud csatlakozni a szerverhez aktív módon 🙂
Fontos kiemelni, hogy akár aktív, akár passzív módot használunk, a kapcsolat titkosítatlanul halad a hálózatunkban! Bár nem jellemző, hogy érzékeny adatok közlekednének, érdemes bekapcsolni valamelyik titkosítást. Ebből is kétféle van, a PSK (osztott kulcs, hasonlóan a wifihez), és a cert alapú.
Most az egyszerűbb, PSK alapú titkosítást fogom bemutatni (ez alapján csináltam).
Generáljunk kulcsokat az 5 szerverhez (a printert, routert, smtp szervert nem agent alapon monitorozzuk, így ők kimaradnak a buliból):
$ psktool -u vcos7a -p database.psk -s 32
Generating a random key for user 'vcos7a'
Key stored to database.psk
$ psktool -u vm1 -p database.psk -s 32
Generating a random key for user 'vm1'
Key stored to database.psk
$ psktool -u vm2 -p database.psk -s 32
Generating a random key for user 'vm2'
Key stored to database.psk
$ psktool -u vm3 -p database.psk -s 32
Generating a random key for user 'vm3'
Key stored to database.psk
$ psktool -u vm4 -p database.psk -s 32
Generating a random key for user 'vm4'
Key stored to database.psk
$ cat database.psk
vcos7a:877f4e0e5cb18352ee468b33264908702e6fd80dccaca83547b246b3d80e7005
vm1:00fcb3f04e646dd9186717bb43f96aa829d01d497ea31254ca72a1ebe568aa96
vm2:2009df4793fbd2f4afd351b825e43e4a2463524fd64fd08c27c9e353f085c94f
vm3:182e39bb63953f682347f717359a24621556d83516c54fff00e86dd8e9d89b45
vm4:d8f5c88673de18afdde646ed3590fbe36d2951b9cfe8fac56e8b722115e791ee
Ha nem lenne feltelepítve a szükséges program: $ sudo yum install gnutls-utils -y
Így néz ki a bővített templates/zabbix_agentd.conf.j2 fájlunk:
################################################################################
{{ ansible_managed | comment }}
################################################################################
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/{{ ZBXLOGDIR }}/zabbix_agentd.log
LogFileSize={{ ZBXLOGFILESIZE }}
Server={{ ZBXSERVER }}
ListenPort={{ ZBXAGENTPORT }}
ListenIP={{ ZBXLISTENIP }}
Hostname={{ inventory_hostname_short }}
TLSConnect=psk
TLSAccept=psk
TLSPSKFile={{ ZBXDIR }}/zabbix.psk
TLSPSKIdentity={{ inventory_hostname_short }}
Négy sorral bővült, ebből 2 statikus, 2 dinamikusan generált az inventory alapján.
A generált kulcsokat be kell másolni az inventoryba is (inventory/inventory.yml
):
---
all:
hosts:
localhost:
children:
servers:
vars:
ansible_ssh_user: vagrant
hosts:
vm1:
ansible_host: 192.168.56.2
ansible_ssh_private_key_file: .vagrant/machines/vm1/virtualbox/private_key
psk_key: 00fcb3f04e646dd9186717bb43f96aa829d01d497ea31254ca72a1ebe568aa96
vm2:
ansible_host: 192.168.56.3
ansible_ssh_private_key_file: .vagrant/machines/vm2/virtualbox/private_key
psk_key: 2009df4793fbd2f4afd351b825e43e4a2463524fd64fd08c27c9e353f085c94f
vm3:
ansible_host: 192.168.56.4
ansible_ssh_private_key_file: .vagrant/machines/vm3/virtualbox/private_key
psk_key: 182e39bb63953f682347f717359a24621556d83516c54fff00e86dd8e9d89b45
vm4:
ansible_host: 192.168.56.5
ansible_ssh_private_key_file: .vagrant/machines/vm4/virtualbox/private_key
psk_key: d8f5c88673de18afdde646ed3590fbe36d2951b9cfe8fac56e8b722115e791ee
redhat:
vars:
ZBXDIR: '/etc'
ZBXLOGDIR: 'zabbix'
hosts:
vm1:
vm2:
debian:
vars:
ZBXDIR: '/etc/zabbix'
ZBXLOGDIR: 'zabbix-agent'
hosts:
vm3:
vm4:
Szükségünk lesz egy új template fájlra, ami ezeket a kulcsokat elhelyezi a szervereinken. Hozzuk létre a templates/zabbix.psk.j2
fájlt ezzel az egyszerű és rövid tartalommal:
{{ psk_key }}
Ez persze önmagában semmit sem ér, ki kell bővíteni a tasks/configure-zabbix_agent.yml
fájlt, így:
---
- name: Zabbix Agent konfigurálása
diff: yes
template: src=~/git/ansible_vagrant/templates/zabbix_agentd.conf.j2 dest={{ ZBXDIR }}/zabbix_agentd.conf backup=yes
notify:
- restart zabbix-agent
- name: Zabbix Agent PSK fájl létrehozása
diff: yes
template: src=~/git/ansible_vagrant/templates/zabbix.psk.j2 dest={{ ZBXDIR }}/zabbix.psk backup=yes owner=zabbix group=zabbix mode=0640
notify:
- restart zabbix-agent
Most már csak le kell futtatni:
$ ansible-playbook playbook/install-zabbix-agent.yml -l servers
Ez a beállítás első fele, most vegyük elő a zabbix weboldalát, és navigáljunk a Data collection -> Hosts
lapra. Kattintsunk a VM1 linkre. Menjünk az Encryption tabra
, majd másoljuk be a korábban létrehozott kulcsot a képen látható módon:
Mentsük el az Update
gombbal. Ezt csináljuk meg a másik három szerverrel is. Az én „vcos7a” nevű szerverem nem szerepel az inventoryban, annál mindent kézzel állítottam be.
Ha mindent jól csináltunk, be fog zöldülni az összes ZBX
ikon, és az Agent encryption
oszlopban lesz két zöld ikon is.
Mára elég ennyi újdonság, nemsokára jövök egy új zabbix témájú cikkel.