oscarmlage.com

djangonaut, sysadmin and father x2

User Tools

Site Tools


temp

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
temp [2017/05/10 21:25] – created Oscar M.temp [2020/08/06 10:02] (current) – created Oscar M.
Line 1: Line 1:
-===== Munin Server ===== +====== OpenWisp ======
-Proveniente de la mitología nórdica, //Muninn// era uno de los dos cuervos que proveía al Dios Odín con información diaria de lo sucedido en todo el mundo. Nombre que ni pintado para un sistema de monitorización. La idea principal es montar el servicio de monitorización en un servidor central que consulte al resto de máquinas su estado, siguiendo un esquema cliente-servidor tenemos que:+
  
-  * Munin server -> Servidor de monitorización. +===== Virtualenv =====
-  * Munin node -> Máquina monitorizada (o cliente) por Munin.+
  
-La elección del servidor depende de cada infraestructura, pero sería interesante que esa máquina no tuviera ningún servicio asociado que monitorizarpuesto que si esa máquina fallaralos servicios asociados no podrían alertar del fallo.+Creamos un virtualenv - y lo activamos - para no enguarrar el sistemaasí todo lo que instalemos con ''pip''en vez de instalarlo en el sistema lo instalaremos en el entorno virtual (dentro de la carpeta ''env'' en este caso):
  
-==== Instalación ==== 
-Basamos toda nuestra instalación en servidores Debian (o //Debian like//) así que la instalación no es demasiado complicada (//nota//, se requiere Apache o similar puesto que los datos que ofrece Munin son vía web): 
 <code> <code>
-(server)apt-get install munin munin-node munin-plugins-extra+mkdir openwisp ; cd openwisp 
 +$ python3 -mvenv --copies env 
 +$ . ./env/bin/activate 
 +(env)$ 
 </code> </code>
  
-==== Configuración ==== +===== Clonar código del repo =====
-Para configurar el servicio abrimos su principal archivo de configuración, ///etc/munin/munin.conf//, aunque nunca está de más hacerle una copia de seguridad antes de toquetearlo: +
-<code> +
-(server)$ cp /etc/munin/munin.conf /etc/munin/munin.conf.dist +
-(server)$ mkdir -p /home/www/munin/{logs,www,conf} +
-(server)$ chown munin:munin /home/www/munin/+
-</code> +
-<file - /etc/munin/munin.conf> +
-# The next three variables specifies where the location of the RRD +
-dbdir /var/lib/munin +
-htmldir /home/www/munin/www +
-logdir /home/www/munin/logs +
-rundir /var/run/munin +
- +
-# Where to look for the HTML template +
-tmpldir /etc/munin/templates +
- +
-# (Exactly one) directory to include all files from. +
-includedir /etc/munin/munin-conf.d +
- +
-# Make graphs show values per minute instead of per second +
-#graph_period minute +
- +
-# a simple host tree +
-[localhost.localdomain] +
-    address 127.0.0.1 +
-    use_node_name yes +
- +
-</file> +
-**OJO**: Los directorios que acabamos de indicar deben existir y ser propiedad de //munin:munin//.+
  
-Ahora tocaría configurar Apache para crear un //VirtualHost// para munin y/o poner una contraseña //.htpasswd// de acceso a los datos, eso ya va con cada forma de configurar, en mi ejemplo será un VirtualHost con contraseña y con mod_expire activo: 
 <code> <code>
-(server)$ a2enmod expires+(env)$ git clone git://github.com/openwisp/openwisp-controller.git src 
 +(env)$ ls 
 +env/ src/
 </code> </code>
-<file - /etc/apache2/sites-available/default> 
-        Alias /munin /home/www/munin/www/ 
-        <Directory /home/www/munin/www/> 
-                Order allow,deny 
-                Allow from all 
-                Options None 
-                AuthUserFile /home/www/munin/conf/users.conf 
-                AuthName "admin" 
-                AuthType Basic 
-                require valid-user 
-                <IfModule mod_expires.c> 
-                        ExpiresActive On 
-                        ExpiresDefault M310 
-                </IfModule> 
-        </Directory> 
-</file> 
-Creamos el fichero de configuración con usuarios/contraseñas al que nos referimos como //AuthUserFile// en la configuración del VirtualHost: 
-<code> 
-(server)$ cd /home/www/munin/conf 
-(server)$ htpasswd -c users.conf admin 
-New password:  
-Re-type new password:  
-Adding password for user admin 
-</code> 
- 
  
-==== Ejecución manual del cron ====+Antes de nada comprobamos qué paquetes tenemos instalados en nuestro entorno virtual:
  
 <code> <code>
-su munin --shell=/bin/bash +(env)pip list 
-$ munin-cron+Package    Version 
 +---------- ------- 
 +pip        19.2.3 
 +setuptools 41.2.0
 </code> </code>
  
-==== Notificaciones ==== +===== Instalación del proyecto =====
- +
-Para configurar las notificaciones lo hacemos directamente en ''munin.conf'' con las siguientes lineas: +
- +
-<file - munin.conf> +
-contact.me.command mail -s "Munin Notification ${var:host} ${var:graph_title}" r0sk10@gmail.com +
-contact.me.always_send warning critical +
-... +
-</file> +
- +
-Y más abajo en el mismo archivo deberemos definir qué es //warning// y qué es //critical// para cada uno de nuestros hosts monitorizados. Por ejemplo, para este host (dina01) configuro como warning que el load llegue a 10, y critical que llegue a 20, en ambos casos debería enviarme un email: +
- +
-<file - munin.conf> +
-... +
-[dina01.servers] +
-    address 82.98.141.94 +
-    use_node_name yes +
-    load.load.warning 10 +
-    load.load.critical 20 +
-</file> +
- +
-El formato para estas notificaciones es ''plugin.fieldname.{critical,warning}''. Se pueden encontrar los fieldnames en las gráficas HTML o también ejecutando el script correspondiente en el servidor que tenga el munin-node instalado y que nos interese monitorizar con una alerta, y viendo los valores que saca, por ejemplo:+
  
 <code> <code>
-ssh dina01 +(env)python setup.py develop 
-# cd /etc/munin/plugins +(env)$ ./install-dev.sh 
-# munin-run load +(env)$ pip install -r requirements-test.txt 
-  load.value 0.15 +(env)$ npm install -g jslint
-# munin-run df +
-  _dev_sdb1.value 67.2829535189925 +
-  _dev_sda1.value 0.0444435818537712 +
-...+
 </code> </code>
  
-Ahora que ya tenemos el ''fieldname'',  vamos a la configuración del servidor de munin y a agregamos su entrada correspondiente: +Comprobamos de nuevo qué paquetes se han instalado en nuestro entorno virtual:
- +
-<file - /etc/munin/munin.conf> +
-... +
-[dina01.servers] +
-    address 82.98.141.94 +
-    use_node_name yes +
-    load.load.warning 10 +
-    load.load.critical 20 +
-    df._dev_sdb1.warning 60 +
-    df._dev_sdb1.critical 90 +
-</file> +
- +
-**Referencias:** +
- +
-  * http://blog.edseek.com/archives/2006/07/13/munin-alert-email-notification/ +
-  * http://wiki.kartbuilding.net/index.php/Munin_Statistics +
- +
- +
-==== Envío de gráficas por Email ==== +
- +
-Munin no dispone de ninguna opción que nos permita enviar las gráficas por correo de una forma automática en una tarea programada o algo así. Estaría bien crear algún script en python que se loguease contra el interfaz web e hiciese un "snapshot" (vía wget o algo así) de las gráficas para enviarlas por correo cada cierto tiempo, una vez al día estaría bien. +
- +
-Mejor todavía, como las imágenes las tenemos generadas en disco, casi sería crear un html con lo que interese y enviarlo vía cron, sin complicaciones. +
- +
-**Referencias:** +
- +
-  * http://serverfault.com/questions/305863/how-to-send-report-created-by-munin-to-email-once-per-week +
- +
- +
-==== Templates ==== +
- +
-La plantilla original de Munin no es que sea demasiado bonita, así que vamos a intentar instalar alguna que otra plantilla que sea un poco más vistosa. Empezamos probando la que nos recomienda Fran Dieguez en su post:+
  
 <code> <code>
-# cd /etc/munin/& +(env)$ pip list 
-# mv templates templates_old +$ pip list 
-# wget http://mabishu.com/downloads/munin-alternative-template.tbz +Package                 Version     Location 
-# bunzip2 munin-alternative-template.tbz +----------------------- ----------- ------------------------------------- 
-# tar xfvvz munin-alternative-template.tar+appdirs                  1.4.4 
 +asgiref                  3.2.10 
 +attrs                    19.3.0 
 +autobahn                 20.7.1 
 +Automat                  20.2.0 
 +Babel                    2.8.0 
 +bcrypt                   3.1.7 
 +billiard                 3.6.3.0 
 +black                    19.10b0 
 +celery                   4.4.7 
 +certifi                  2020.6.20 
 +cffi                     1.14.1 
 +channels                 2.4.0 
 +chardet                  3.0.4 
 +click                    7.1.2 
 +constantly               15.1.0 
 +coverage                 5.2.1 
 +coveralls                2.1.1 
 +cryptography             3.0 
 +daphne                   2.5.0 
 +defusedxml               0.6.0 
 +Django                   3.0.9 
 +django-allauth           0.41.0 
 +django-extensions        2.2.9 
 +django-leaflet           0.27.1 
 +django-loci              0.3.3 
 +django-model-utils       4.0.0 
 +django-organizations     1.1.2 
 +django-phonenumber-field 4.0.0 
 +django-reversion         3.0.7 
 +django-sortedm2m         3.0.2 
 +django-taggit            1.3.0 
 +django-x509              0.7 
 +djangorestframework-gis  0.14 
 +docopt                   0.6.2 
 +flake8                   3.8.3 
 +hyperlink                20.0.1 
 +idna                     2.10 
 +importlib-metadata       1.7.0 
 +incremental              17.5.0 
 +isort                    5.3.0 
 +jsonfield                3.1.0 
 +kombu                    4.6.11 
 +mccabe                   0.6.1 
 +mock-ssh-server          0.8.2 
 +more-itertools           8.4.0 
 +netjsonconfig            0.8.1 
 +oauthlib                 3.1.0 
 +openwisp-controller      0.7.post1   /Users/oscar/code/python/openwisp/src 
 +openwisp-users           0.2.2 
 +openwisp-utils           0.5.1 
 +packaging                20.4 
 +paramiko                 2.7.1 
 +pathspec                 0.8.0 
 +phonenumbers             8.11.5 
 +Pillow                   7.2.0 
 +pip                      19.2.3 
 +pluggy                   0.13.1 
 +py                       1.9.0 
 +pyasn1                   0.4.8 
 +pyasn1-modules           0.2.8 
 +pycodestyle              2.6.0 
 +pycparser                2.20 
 +pyflakes                 2.2.0 
 +PyHamcrest               2.0.2 
 +PyNaCl                   1.4.0 
 +pyOpenSSL                19.1.0 
 +pyparsing                2.4.7 
 +pytest                   5.4.3 
 +pytest-asyncio           0.14.0 
 +pytest-cov               2.10.0 
 +pytest-django            3.9.0 
 +python3-openid           3.2.0 
 +pytz                     2020.1 
 +redis                    3.5.3 
 +regex                    2020.7.14 
 +requests                 2.24.0 
 +requests-oauthlib        1.3.0 
 +scp                      0.13.2 
 +service-identity         18.1.0 
 +setuptools               41.2.0 
 +six                      1.15.0 
 +sqlparse                 0.3.1 
 +swapper                  1.1.2.post1 
 +toml                     0.10.1 
 +Twisted                  20.3.0 
 +txaio                    20.4.1 
 +typed-ast                1.4.1 
 +urllib3                  1.25.10 
 +vine                     1.3.0 
 +wcwidth                  0.2.5 
 +zipp                     3.1.0 
 +zope.interface           5.1.0
 </code> </code>
  
-Una vez tenemos disponible el nuevo directorio "templates" debemos esperar 5 minutos o así a que se vuelva a ejecutar munin y que reemplace en ''/home/wwww/munin/www/'' los archivos estáticos (logo.png, styles.css y favicon.ico si mal no recuerdo). +Paquetes que he tenido que instalar manualmente mayores:
- +
- +
-**Referencias:** +
- +
-  * http://www.mabishu.com/blog/2010/03/24/improve-munin-stats-page-with-new-layout-and-plugins/ +
-  * http://blog.redbranch.net/2013/08/13/improving-the-munin-layout/ +
-  * https://github.com/mallocator/Munin-JQuery-Template +
-==== Discoazul ==== +
- +
-En el caso concreto de Discoazul hemos centralizado el servidor Munin en la máquina que se encarga de hacer las copias de seguridad (//ks36600.kimsufi.com// o también llamado //backup//), instalando el agente en el resto de nodos. De forma que el acceso quedaría tal que así: +
- +
-    * url: http://ks36600.kimsufi.com/munin/ +
-    * l/p: admin/8888da8888 +
- +
-==== Menus ==== +
- +
-En el caso de Menus no se ha instalado Munin puesto que han creado un RRD customizado para los servidores f1, db1 y mng directamente corriendo en un cron Symfony2. La administración de ese cron es accesible través de la web de menús con un user/pass que tenga privilegios. El cron (por si fuera necesario en algún momento) es el siguiente:+
  
 <code> <code>
-*/1 * * * * php /home/menus/site/app/console admin:rrd --env prod --host f1 --cpu --ram --net --net-interface eth0 --io --nginx > /dev/null+(env)$ pip install channels 
 +(env)$ pip install django-leaflet 
 +(env)$ pip install "Pillow~=7.2.0" 
 +(env)$ pip install jsonfield 
 +(env)$ pip install cryptography 
 +(env)$ pip install "django-allauth<0.42.0" 
 +(env)$ pip install "django-extensions<2.3" 
 +(env)$ pip install "phonenumbers<8.12.0" 
 +(env)$ pip install django-organizations 
 +(env)$ pip install django-phonenumber-field 
 +(env)$ pip install "amqp<2.7"
 </code> </code>
-===== Munin Node ===== 
-El //Munin node// es el nodo o agente que recopila datos y se los envía al servidor para poder pintar las gráficas. 
  
-==== Instalación ==== +Repetimos de nuevo los siguientes pasos:
-La instalación es muy sencilla, en la instalación del propio servidor ya lo hemos hecho de forma implícita, pero para instalar en cualquier otra máquina sería sencillo: +
-<code> +
-(client)$ apt-get install munin-node munin-plugins-extra +
-(client)$ apt-get install liblwp-useragent-determined-perl libvirt-bin libcache-cache-perl +
-</code> +
-La segunda linea es para instalar todas las dependencias que más adelante harán falta para activar los sensores de distintos servicios (Apache, MySQL, Postfix...). Muy recomendable su instalación en prácticamente todas las máquinas. +
-==== Configuración ==== +
-La configuración se centra en el fichero ///etc/munin/munin-node.conf//, si es en el propio servidor le ponemos como host 127.0.0.1 para que no escuche en todas las interfaces, y el puerto: +
-<file - /etc/munin/munin-node.conf> +
-host 127.0.0.1 +
-port 4949 +
-</file> +
-Si es en otros equipos clientes que van a ser monitorizados por el servidor debemos ajustar más parámetros, host_name para dar nombre al aquiop, allow con la ip del servidor para indicarle que puede acceder a los datos, host con la ip del cliente y puerto en el que se ejecutará: +
-<file - /etc/munin/munin-node.conf> +
-host_name maquina1.loquesea.com +
-allow ^87\.98\.219\.108$ +
-host * +
-port 4949 +
-</file> +
-Y tenemos que ir al servidor, al fichero ///etc/munin/munin.conf// a agregar este nuevo host cliente: +
-<file - /etc/munin/munin-node.conf> +
-[maquina.loquesea.com] +
-address 192.168.0.2 +
-use_node_name yes +
-</file> +
-Como paso final, reiniciaríamos el servicio (munin-node). El propio munin-node hace de servidor y de cliente en el servidor, con lo que llegaría con reiniciar el //munin-node//, comprobamos que el puerto esté abierto: +
-<code> +
-(server)$ /etc/init.d/munin-node restart +
-(server)$ nmap localhost -p 4949 +
-4949/tcp open  unknown +
-</code>+
  
-==== Plugins ==== 
-Una vez llegados a este punto tendríamos las gráficas básicas activadas (cpu, load, ram, disco...), pero si queremos agregar más gráficas necesitamos hacer uso de otros plugins. Para una comprobación automática de los plugins que podemos monitorizar (siempre que previamente hayamos instalado el paquete //munin-plugins-extra// y las dependencias antes mencionadas) podremos ver lo que el propio munin nos aconseja: 
 <code> <code>
-(client)$ munin-node-configure --suggest+(env)$ python setup.py develop 
 +(env)$ ./install-dev.sh 
 +(env)$ pip install -r requirements-test.txt
 </code> </code>
-**OJO**: Si aquí obtenemos muchos mensajes "//no//" (por ejemplo Apache, MySQL, etc...) es que tenemos las dependencias sin instalar: 
-<code> 
-(client)$ munin-node-configure --suggest 
-acpi                       | no   | [ACPI program not found]                
-apache_accesses            | no   | [LWP::UserAgent not found]              
-apache_processes           | no   | [LWP::UserAgent not found]              
-apache_volume              | no   | [LWP::UserAgent not found]              
-courier_mta_mailqueue      | no   | [spooldir not found]                    
-... 
-slapd_                     | no   | no [Net::LDAP not found]                
-</code> 
-Una vez hemos resuelto estos problemas y estamos de acuerdo con las //sugerencias//, podemos aceptarlas directamente para que se instalen esos sensores en la monitorización de ese host: 
-<code> 
-(cliente)$ munin-node-configure --shell 
-ln -s '/usr/share/munin/plugins/apache_accesses' '/etc/munin/plugins/apache_accesses' 
-ln -s '/usr/share/munin/plugins/apache_processes' '/etc/munin/plugins/apache_processes' 
-ln -s '/usr/share/munin/plugins/apache_volume' '/etc/munin/plugins/apache_volume' 
-ln -s '/usr/share/munin/plugins/mysql_' '/etc/munin/plugins/mysql_bin_relay_log' 
-... 
-</code> 
- 
-<WRAP info> 
-OJO: normalmente no salen los ''ln'' en pantalla, si salen es que algo ha fallado. La última vez que ejecuté el ''--shell'' no funcionó, no creó los enlaces simbólicos adecuadamente, así que tuve que copiar/pegar toda la salida del comando para que funcionase. Si no salen los ''ln'' por pantalla teóricamente todo funcionó adecuadamente, comprobarlo con un ''ls /etc/munin/plugins/'' 
-</WRAP> 
- 
-Y para finalizar reiniciamos el nodo de Munin: 
-<code> 
-(client)$ /etc/init.d/munin-node restart 
-</code> 
- 
-=== Problemas con algunos plugins === 
- 
-Muchas veces algún plugin en concreto da problemas y notifica cada 5 minutos el problema, es el caso del plugin smart (S.M.A.R.T), que no deja de dar el coñazo, un ejemplo: 
- 
-<code> 
-menus :: backup.menus :: S.M.A.R.T values for drive sda 
- WARNINGs: smartctl_exit_status is 96.00 (outside range [:1]). 
-</code> 
- 
-Para deshabilitar el plugin nos vamos a ''/etc/munin/plugins'' y simplemente eliminamos el enlace simbólico, reiniciamos el servicio (''/etc/init.d/munin-node restart'') y nos olvidamos del problema. 
- 
-=== Problemas con notificaciones (2016.10.24) === 
- 
-Cuando manejas una cantidad de servidores superior a 10 (aprox.) empiezan a llegar notificaciones de todo tipo. Puestos en esta situación lo importante es saber diferenciar las críticas del resto así que he hecho un par de cambios a esta configuración: 
- 
-  * Ya no recibo los correos de **munin** ni los de **monit** en su correspondiente carpeta, van directamente a la INBOX para no perderme nada, a riesgo de recibir un montón de correos al día. Para eso la segunda medida: 
-  * Borrar los ''plugins'' de munin que son innecesarios o no me ofrecen información relevante (o simplemente, paso de ellos, temperaturas y demás): <code>$ cd /etc/munin/plugins/ 
-$ rm if_* df_inode forks fw_* interrupts vmstat bonding_* entropy threads iosta* irqst* open_* hddtemp* ntp* smart*</code> 
temp.1494451508.txt.gz · Last modified: 2017/05/10 21:25 by Oscar M.