Capita spesso di dover monitorare la dimensione di sottodirectory di una directory principale, come ad esempio le home directory degli utenti in un sistema Linux. La realizzazione di questo tipo di controllo presenta alcune problematiche:
- Non si conosce a priori il numero di sottodirectory
- Nel caso di directory con molti livelli annidati il tempo necessario al calcolo delle dimensioni potrebbe essere molto lungo, impedendo in questo modo l’uso dell’agente per eseguire il calcolo stesso.
Per risolvere il primo problema faremo ricorso a una Low Level Discovery. Andiamo a costruire un template con una LLD che cercherà tutte le sottodirectory di una cartella padre e creerà tanti item di tipo trapper quante sono le le subdir trovate.
Per quanto riguarda il secondo punto si farà svolgere il lavoro di calcolo delle dimensioni a uno script installato sul sistema controllato e poi azionato tramite cron.
Per prima cosa è necessario creare SUL SISTEMA MONITORATO una estensione dell’agente che cerchi le sottocartelle: per fare questo si usa la voce UserParameter. La si può inserire direttamente nel file di configurazione dello Zabbix agent, ma per questioni di “pulizia” io preferisco fare un file .conf dedicato e separato e metterlo nella directory /etc/zabbix/zabbix_agentd.d.
Creiamo quindi in questa directory un file che chiamiamo dir.conf con dentro questa riga:
UserParameter=folder.discovery[*],/usr/bin/find $1 -maxdepth $2 -type d| /usr/bin/awk 'BEGIN {first=1; printf "%s","{\"data\":["} {if (first != 1) printf "%s",","; first=0; printf "{\"{#FOLDER_NAME}\":\"%s\"}",$$1} END {print "]}"}'
Volendo si può testare questo oggetto creando un file bash contenente il comando (da /usr/bin/find alla fine della riga) e poi chiamarlo da shell passandogli la directory padre ($1) e la profondità ($2), Il risultato è una struttura JSON di questo tipo:
{“data”:[{“{#FOLDER_NAME}”:”/var”},{“{#FOLDER_NAME}”:”/var/lib”},{“{#FOLDER_NAME}”:”/var/log”},{“{#FOLDER_NAME}”:”/var/adm”},{“{#FOLDER_NAME}”:”/var/cache”},{“{#FOLDER_NAME}”:”/var/db”},{“{#FOLDER_NAME}”:”/var/empty”},{“{#FOLDER_NAME}”:”/var/ftp”},{“{#FOLDER_NAME}”:”/var/games”},{“{#FOLDER_NAME}”:”/var/gopher”},{“{#FOLDER_NAME}”:”/var/local”},{“{#FOLDER_NAME}”:”/var/nis”},{“{#FOLDER_NAME}”:”/var/opt”},{“{#FOLDER_NAME}”:”/var/preserve”},{“{#FOLDER_NAME}”:”/var/spool”},{“{#FOLDER_NAME}”:”/var/tmp”},{“{#FOLDER_NAME}”:”/var/yp”},{“{#FOLDER_NAME}”:”/var/kerberos”},{“{#FOLDER_NAME}”:”/var/crash”},{“{#FOLDER_NAME}”:”/var/singularity”}]}
Se il test è andato a buon fine cancelliamo il file bash che abbiamo usato per provarlo, salviamo il file dir.conf e riavviamo l’agente, che si prenderà anche l’estensione che abbiamo appena creato.
Sempre sul sistema da monitorare occorre preparare l’ambiente per lo script che valorizzerà gli item trapper.
Installare Zabbix Sender:
[Red Hat/Centos/Oracle Linux] yum install zabbix-sender [Debian/Ubuntu] apt install zabbix-sender
Creare la directory /var/lib/zabbix ($HOME dell’utente zabbix) e dargli i diritti corretti:
mkdir /var/lib/zabbix chown zabbix:zabbix /var/lib/zabbix
Copiare lo script dirsize.pl nella directory /var/lib/zabbix
Inserire nel crontab tante righe quante sono le subdir da calcolare:
00 23 * * * /var/lib/zabbix/dirsize.pl /archive/s1
10 23 * * * /var/lib/zabbix/dirsize.pl /archive/s2
Il template è molto semplice e comprende una sola LLD con un solo item protoype. Di default la LLD fa la discovery a partire dalla root directory (/) e scende per due livelli. Questo comportamento può essere cambiato intervenendo sui parametri con cui viene chiamata la funzione folder.discovery. Nel dubbio lasciamo la discovery molto ampia e provvediamo a filtrarla dopo. Il secondo parametro da adattare è proprio il filtro delle directory da monitorare. A titolo di esempio il template viene rilasciato con un filtro che conserva solo le directory /tmp e /home. Modificate il filtro in base alle vostre esigenze, facendo attenzione a lasciare il gruppo \/ alla fine, altrimenti la LLD, assieme alle sottodirectory prenderà anche la directory padre. Ovviamente se pensate di dover applicare il template a più di un host, le macro del filtro applicatele a livello di host e non di template, in questo modo varranno solo per l’host che state monitorando e non per tutti quelli a cui avete applicato il template (anche le macro LLD sono gerarchiche, come quelle generiche).
Applicate il template all’host e il gioco è fatto.
Nota conclusiva: per funzionare il controllo ha bisogno che, sul sistema monitorato, l’utente zabbix abbia accesso almeno in lettura alle cartelle di cui volete controllare la dimensione. Se questo non fosse vero avete due possibilità: lavorare sui permessi delle directory, aggiungendo l’utente zabbix dove serve, oppure fare girare l’agente con i permessi di root. La seconda opzione non è elegantissima e potrebbe dare adito a qualche problema di sicurezza, ma in alcuni casi è inevitabile.