Munin és un servei de monitorització. es un software de monitorització que ens permet monitoritzar molts paràmetres de diversos equips i visualitzar-los en còmodes gràfiques diàries, setmanals, mensuals i anuals. Disposa d'una interfície molt amigable, mitjançant un servidor web, està desenvolupat amb perl i permet la utilització de plugins, cosa que el fa realment versàtil. Mostra una gran quantitat d'informació mitjançant gràfiques creades amb la llibreria (biblioteca-library) gràfica RRDtool.
El seu millor escenari es troba en el manteniment de servidors o en la gestió de diversos llocs de treball. Es pot utilitzar per comprovar l'estat de salut i càrrega de les màquines, anticipar problemes de rendiment o capacitat, i en cas de problemes ofereix a posteriori valuosa informació sobre els moments anteriors al problema.
L'origen del nom tal i com es comenta a la pàgina oficial de Munin, està en un dels nom d'un dels corbs d'un antic deu de la mitologia nòrdica anomenat el Odin (Rei del Valhala, el reialme dels deus). Dos corbs Hugin i Munin, eren els corbs del deu nòrdic Odin. Sobrevolaven per tot el Midgard (mon on viuen el humans), observant i recordant tot el que veien per, posteriorment, explicar-ho a Odin.
Munin pot descarregar-se directament des de la web de Munin, o pot inatal·lar-se desde els repositoris de la distribució (normalment, dependrà de la distribució).
Munin vol dir memòria.
El seu funcionament es basa en un model client-servidor. En els clients, anomenats nodes, s'executen els diversos plugins que conformen cada monitor que es vol controlar, i el servidor central es comunica amb cada node per recopilar periòdicament les dades que generen de forma local els plugins.
Munin està desenvolupat en Perl, i fa ús de moltes eines del sistema, entre elles rrdtool per generar les gràfiques i sysstats per obtenir dades. Els connectors estan majoritàriament programats en Perl, però es poden programar plugins a mida en qualsevol altre llenguatge de scripting o compilat.
En aquest HowTo montoritzarem tres màquines (els tres nodes, de noms Belial, Asmodeus i Leviatan), instal·lant el servidor en una d'elles (Belial). El resultat final serà que podrem accedir amb un navegador a un URL que apunta al servidor (Belial) i en ell veure les gràfiques de les tres màquines.
Parteixo de la base que les tres màquines tindran els mateixos monitors i que almenys la màquina que farà de servidor ja té instal·lat i funcionant Apache, és a dir, que es pot accedir des d'un navegador a través d'una URL. En el meu cas, necessitava els monitors d'Apache, MySQL, sistema de fitxers (espai usat, arxius oberts ...), processador (ús, processos llançats ...) i memòria (ús de RAM i de swap).
Belial (Ubuntu 13.04) ---> Servidor/Node ---> 192.168.1.34 Asmodeus (Ubuntu 12.04) ---> Node ---> 129.168.1.33 Leviatan (U.Server 12.04) ---> Node ---> 129.168.1.36
[email protected]:~$ sudo apt-get install apache2 [email protected]:~$ sudo service apache2 start [email protected]:~$ sudo apt-get install php5 libapache2-mod-php5 php5-cli php5-mysql [email protected]:~$ sudo service apache2 restart [email protected]:~$ sudo apt-get install mysql-server mysql-client libmysqlclient-dev [email protected]:~$ sudo service mysql restart
Per instal·lar el Munin en un node amb una distribució basada en Debian, n'hi ha prou amb instal·lar des dels seus repositoris:
$ sudo apt-get install munin-node
Així doncs executem el node Munin a les tres màquines.
[email protected]:~$ sudo apt-get install munin-node [email protected]:~$ sudo apt-get install munin-node [email protected]:~$ sudo apt-get install munin-node
I de la mateixa manera per instal·lar el Munin a la màquina que farà de servidor. En aquest cas Belial.
[email protected]:~$ sudo apt-get install munin munin-node
La instal·lació del Munin crea automàticament un usuari anomenat munin. Aquest usuari serà l'encarregat d'executar els processos necessaris i que utilitzarem per a les probes. Tanmateix, aquest usuari no permet fer login (/bin/false o /bin/nologin en el /etc/passwd) de manera que per usar-lo ho farem de la següent manera:
[email protected]:~$ su - munin --shell=/bin/bash
Cal que això es faci així, perquè sinó l'única manera de fer proves és amb root, el problema és que si fem alguna prova amb root, tots els directoris i arxius de Munin es crearan o canviaran per ser propietat de root, i no podrem executar les tasques cron amb l'usuari munin.
Podem canviar la clau de l'usuari munin: -------------------------------> NO FUNCIONA
[email protected]:/# htpasswd -c /etc/munin/munin.passwd munin New password: --->password Re-type new password: --->password
El servidor s'encarregarà de sol·licitar cada cert temps (mitjançant una tasca cron) als nodes les dades recopilades, processar aquestes dades i generar els informes amb format HTML. La seva configuració és immediata, ja que només és necessari ajustar les rutes i els nodes als que controlarà. A l'exemple deixaré les rutes per defecte ja que són adequades a la meva configuració, però si és necessari s'han de canviar, per exemple si el punt on es veuran les dades no està a /var/www
$ sudo nano /etc/munin/munin.conf dbdir /var/lib/munin htmldir /var/www/munin ---> Compte amb aquesta que s'ha de canviar!! logdir /var/log/munin rundir /var/run/munin # La pròpia màquina Belial [Belial.localdomain] address 127.0.0.1 local_address 127.0.0.1 use_node_name yes # Maquina 2 Asmodeus [Asmodeus.localdomain] address 192.168.1.33 local_address 192.168.1.33 use_node_name yes # Maquina 3 Leviatan [Leviatan.localdomain] address 192.168.1.36 local_address 192.168.1.36 use_node_name yes
Com es pot veure, per a cada node es crea una entrada identificada pel hostname de la màquina a controlar. Per cada node s'informa de la seva IP. He comprovat que de vegades falla si no s'inclou la clàusula local_address a més de la address bàsica, pel que és convenient afegir-la a tots els nodes.
Amb el mv traslladem els arxius fins al path /var/munin/www
[email protected]:~$ sudo mv /var/cache/munin/www/ /var/www/munin
Comprovem que s'ha mogut tota la carpeta correctament cap a /var/www/munin (ha aparegut la carpeta munin amb tots els seus arxius a la carpeta www, que anteriorment no estava)
[email protected]:/var/www/munin$ ls definitions.html favicon.ico index.html localdomain logo-h.png logo.png style.css
Assignem al directori Munin a l'usuari i grup Munin utilitzant la comanda chown
[email protected]:~$ sudo chown munin.munin -R /var/www/munin
La configuració dels nodes es fa a /etc/munin/munin-node.conf, i cal fer-la en les tres màquines. Bàsicament consisteix a donar-li nom a la màquina i permetre l'accés des de la IP de la màquina que farà de servidor:
Node Belial: [email protected]:/$ sudo nano /etc/munin/munin-node.conf .... host_name Belial.localdomain .... allow ^127\.0\.0\.1$ Node Asmodeus: [email protected]:/$ sudo nano /etc/munin/munin-node.conf .... host_name Asmodeus.localdomain .... allow ^192\.168\.1\.34$ Node Leviatan: [email protected]:/$ sudo nano /etc/munin/munin-node.conf .... host_name Leviatan.localdomain .... allow ^192\.168\.1\.34$
Els hostname ha de ser el mateix que hem posat en l'arxiu de configuració del servidor per a cada un dels nodes. La Ip de la màquina que farà de servidor y que accedirà a cada un dels nodes ha d'escriure's com una expressió regular, el que ens permet tant introduir una IP fixa, com un rang de IP's.
El funcionament de Munin és mitjançant plugins. Hi ha dotzenes de plugins i es poden programar nous plugins de Munin utilitzant qualsevol llenguatge de scripting o compilat. Els plugins són a /usr/share/munin/plugins, i per utilitzar-ne un n'hi ha prou amb fer un enllaç simbòlic des de /etc/munin/plugins. D'aquesta manera, traurem els que no utilitzarem i afegirem els que no estiguin per defecte, encara que abans de res anem a veure els plugins que tenim disponibles ... i deixarem que Munin ens indiqui quins ens convindria utilitzar:
[email protected]:/$ sudo munin-node-configure --suggest Plugin | Used | Suggestions ------ | ---- | ----------- acpi | no | no [cannot read /proc/acpi/thermal_zone/*/temperature] amavis | no | no apache_accesses | yes | yes apache_processes | yes | yes apache_volume | yes | yes apc_envunit_ | no | no [no units to monitor] bonding_err_ | no | no [No /proc/net/bonding] courier_mta_mailqueue | no | no [spooldir not found] courier_mta_mailstats | no | no [could not find executable] courier_mta_mailvolume | no | no [could not find executable] cps_ | no | no cpu | yes | yes cpuspeed | yes | yes cupsys_pages | no | no [logfile not readable] df | yes | yes df_inode | yes | yes diskstats | yes | yes entropy | yes | yes exim_mailqueue | no | no [no exiqgrep] exim_mailstats | no | no [logdir does not exist] fail2ban | no | no [/usr/bin/fail2ban-client not found] forks | yes | yes fw_conntrack | no | no fw_forwarded_local | no | no fw_packets | yes | yes hddtemp_smartctl | no | no if_ | yes | yes (eth0 wlan0) if_err_ | yes | yes (eth0 wlan0) interrupts | yes | yes ip_ | no | yes ipmi_ | no | no [missing ipmitool command] irqstats | yes | yes load | yes | yes lpstat | yes | yes memory | yes | yes munin_stats | no | yes mysql_ | no | no [Missing dependency Cache::Cache] netstat | no | no nfs4_client | no | no [no /proc/net/rpc/nfs] nfs_client | no | no nfsd | no | no [no /proc/net/rpc/nfsd] nfsd4 | no | no [no /proc/net/rpc/nfsd] nginx_request | no | no [no nginx status on http://localhost/nginx_status] nginx_status | no | no [no nginx status on http://localhost/nginx_status] ntp_kernel_err | no | no ntp_kernel_pll_freq | no | no ntp_kernel_pll_off | no | no ntp_offset | no | no [no ntpq program] ntp_states | no | no [ntpq not found] nvidia_ | no | no [no nvclock executable at /usr/bin/nvclock, please configure] open_files | yes | yes open_inodes | yes | yes pgbouncer_connections | no | no [DBD::Pg not found, and cannot do psql yet] pgbouncer_requests | no | no [DBD::Pg not found, and cannot do psql yet] postfix_mailqueue | no | no postfix_mailvolume | no | no [postfix not found] postgres_autovacuum | no | no postgres_bgwriter | no | no postgres_cache_ | no | no postgres_checkpoints | no | no postgres_connections_ | no | no postgres_connections_db | no | no postgres_locks_ | no | no postgres_oldest_prepared_xact_ | no | no postgres_prepared_xacts_ | no | no postgres_querylength_ | no | no postgres_scans_ | no | no postgres_size_ | no | no postgres_transactions_ | no | no postgres_tuples_ | no | no postgres_users | no | no postgres_xlog | no | no proc | no | no proc_pri | yes | yes processes | yes | yes ps_ | no | no qmailqstat | no | no selinux_avcstat | no | no [missing /selinux/avc/cache_stats file] sendmail_mailqueue | no | no sendmail_mailstats | no | no [no mailstats command] sendmail_mailtraffic | no | no [no mailstats command] slapd_ | no | no [Net::LDAP not found] slapd_bdb_cache_ | no | no [Can't execute db_stat file '/usr/bin/db4.6_stat'] slony_lag_ | no | no [DBD::Pg not found, and cannot do psql yet] smart_ | no | no [smartmontools not found] snort_alerts | no | no [/var/snort/snort.stats not readable] snort_bytes_pkt | no | no [/var/snort/snort.stats not readable] snort_drop_rate | no | no [/var/snort/snort.stats not readable] snort_pattern_match | no | no [/var/snort/snort.stats not readable] snort_pkts | no | no [/var/snort/snort.stats not readable] snort_traffic | no | no [/var/snort/snort.stats not readable] squeezebox_ | no | no [no connection on localhost port 9090] squid_cache | no | no [could not connect: Connection refused] squid_objectsize | no | no [could not connect: Connection refused] squid_requests | no | no [could not connect: Connection refused] squid_traffic | no | no [could not connect: Connection refused] swap | yes | yes threads | yes | yes tomcat_ | no | no uptime | yes | yes users | yes | yes varnish_ | no | no [varnishstat could not be found] vmstat | yes | yes vserver_cpu_ | no | no [/proc/virtual/info not found] vserver_loadavg | no | no [/proc/virtual/info not found] vserver_resources | no | no [/proc/virtual/info not found] yum | no | no [Could not run yum]
La sortida d'aquesta comanda ens indica els plugins que tenim en el sistema, si estan o no en ús, i si es poden utilitzar. Si es poden utilitzar veurem un 'yes' a l'última columna, mentre que si no es poden usar se'ns mostrarà el missatge d'error corresponent.
També podem provar un plugin de forma aïllada, de la següent manera:
Per exemple: $ /usr/share/munin/plugins/apache_accesses autoconf yes
Per treure un plugin, per exemple iferr_eth0, farem.
$ sudo rm /etc/munin/plugins/iferr_eth0
Per afegir-ne un, per exemple apache_accesses:
$ sudo ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
Es pot observar que alguns plugins acaben amb un símbol de subratllat. Aquests són casos especials, que esperen rebre un paràmetre que és el que va després del símbol de subratllat a l'enllaç simbòlic. Un exemple són els monitors de les interfícies de xarxa, per exemple, en el meu cas:
[email protected]:/$ ls -l /etc/munin/plugins | grep -i wlan lrwxrwxrwx 1 root root 32 jun 9 22:05 if_err_wlan0 -> /usr/share/munin/plugins/if_err_ lrwxrwxrwx 1 root root 28 jun 9 22:05 if_wlan0 -> /usr/share/munin/plugins/if_
Alguns plugins necessiten configuració extra. Això és degut a que poden requerir ser executades amb un usuari en concret, o que esperen rebre més paràmetres, com és el cas del connector de MySQL. Aquestes opcions s'ajusten a /etc/munin/plugins.conf, el qual convé revisar si algun plugin no funciona correctament.
Comprovem que els plugin mysql funcione correctament:
[email protected]:/$ /usr/share/munin/plugins/mysql_queries autoconf yes yes
comprovem que funciona
Comprovem que el plugin estigui activat.
[email protected]:/$ /usr/share/munin/plugins/apache_accesses autoconf yes yes
comprovem que està activat
Servidor: [email protected]:/$ sudo iptables -nvL Chain INPUT (policy ACCEPT 14466 packets, 8306K bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 192.168.1.36 0.0.0.0/0 tcp dpt:4949 0 0 ACCEPT tcp -- * * 192.168.1.34 0.0.0.0/0 tcp dpt:4949 0 0 ACCEPT tcp -- * * 192.168.1.33 0.0.0.0/0 tcp dpt:4949
Nodes: Deixarem entrar les connexions del servidor per poder recopilar les dades. [email protected]:/$ sudo iptables -nvL Chain INPUT (policy ACCEPT 7901 packets, 8306K bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 192.168.1.34 0.0.0.0/0 tcp dpt:4949 [email protected]:/$ sudo iptables -nvL Chain INPUT (policy ACCEPT 7443 packets, 8306K bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 192.168.1.34 0.0.0.0/0 tcp dpt:4949
El servidor d'Munin es connectarà cada cert temps als nodes per sol · licitar les dades; aquesta connexió es fa pel port TCP 4949, per la qual cosa cal obrir aquest port en el firewall de tots els nodes per permetre l'accés des de la IP del servidor:
$ /etc/init.d/iptables restart
Un cop fetes les configuracions i provats els plugins, es reinicien els sistemes en cadascuna de les màquines, per al que n'hi ha prou amb rellançar el dimoni de Munin en cadascun dels nodes:
$ sudo /etc/init.d/munin-node restart
I a la màquina que fa de servidor es llança la comanda que recopila la informació. És important recordar llançar aquesta comanda sempre amb l'usuari munin, ja que sinó tindrem problemes de permisos:
$ su munin - --shell=/bin/bash $ munin-cron $ exit
$ sudo /etc/init.d/cron restart