IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

MUNIN

RafelmelichLogoMunin.png

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ó).


Rafelmelichhuninimunin.jpg

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).


PLANTEJAMENT DE LA PRÀCTICA

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


PRE-INSTAL·LACIÓ

  • Al menys a la màquina que farà de servidor haurem de tenir instal·lat un servidor com l'Apache, és a dir que s'hi pugui accedir mitjançant una URL.
  • Podem optar per instal·lar el LAMP (Ubuntu 13.04).
[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


INSTAL·LACIÓ DEL MUNIN

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

Rafelmelichmuninnodebelial.png Rafelmelichmuninnodeasmodeusbeta.png RafelmelichmuninnodeLeviatan.png

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

Rafelmelichmuninserverbelial.png

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

Rafelmelichusermenin.png

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


CONFIGURACIÓ DEL SERVIDOR

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


CONFIGURACIÓ DELS NODES

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$

Rafelmelichlevatanodeconf.png

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.


CONFIGURACIÓ DELS PLUGINS

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

Rafelmelichpluginstestmunin.png

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.


CONFIGURACIÓ PLUGINS MYSQL

Comprovem que els plugin mysql funcione correctament:

[email protected]:/$ /usr/share/munin/plugins/mysql_queries autoconf yes
yes

comprovem que funciona

CONFIGURACIÓ PLUGINS APACHE

Comprovem que el plugin estigui activat.

[email protected]:/$ /usr/share/munin/plugins/apache_accesses autoconf yes
yes

comprovem que està activat


IPTABLES

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


INICIAR MONITORS I ACCÉS A LES GRÀFIQUES

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

RAfelmelichgrafmunin1.png RAfelmelichgrafmunin2.png RAfelmelichgrafmunin3.png