Portes económicos

uship Desde hace unas semanas estoy viajando y usando bastante el transporte público, además de hacer casi 8 kilómetros al día andando. Al principio me pareció una gran idea, despejarme andando durante un “ratito” cada día antes y después de ir a la oficina, pero pasadas tres semanas… ha dejado de serlo.

He decidido traer mi juguete hasta Barcelona y para ello he puesto un anuncio en el portal www.uship.com que  permite a empresas de transporte ofrezcer sus servicios y hacer ofertas para que uno mismo seleccione el que más le guste o interese. Ahora me encuentro en la primera etapa, punto en el que he aceptado una oferta de la empresa www.mototransporte.com. Por ahora me parece una empresa competente, así que confío en una entrega satisfactoria.

Muy pronto pondré una actualización sobre el resultado.

 

Yamaha XJ6

Yamaha XJ6

Actualización: La entrega fue perfecta, pude ver como se transportó y estaba muy bien asegurada y tapada, además de aceptar de muy buen grado sumar al porte las chaquetas, cascos y guantes. Buenos, muy buenos.

www.mototransporte.com es 100% recomendable y sobre todo, quiero destacar la amabilidad y el trato de del transportista, les doy un diez !! Aquí os dejo una foto de mi juguete cuando llegó :)

Nagstamon

Después de un año sin ver Nagstamon parpadeando en la pantalla (no siempre era malo), vuelvo a recuperarlo para que siga permitiendo proactividad en el control de los sistemas. ¿Quién no reconoce el soniquete que tienen sus alertas? y es que para mi gusto, hay pocas aplicaciones para conectar a Nagios y mantenerte alerta, que sean tan interesantes como esta.
Vale, también hay que comentar que es un coñazo tenerla todo el día parpadeando y si hay alguien al que no le moleste o no le parpadee sin parar, que lo diga si tiene valor !!

Apt proxy authentication with @ in password

Tras montar una máquina virtual con Ubuntu, he intentado lanzar un “apt-get update”, al estar en una red corporativa no ha salido correctamente hacia el exterior porque no está configurado el proxy. Tras crear el archivo y configurar las variables correspondientes en /etc/apt/apt.conf.d/88apt-proxy (si no existe créalo, yo lo hice) me encuentro con un error en la clave y es que, mi clave acaba en @, entendiendo que busca el servidor @192.168.1.10. He probado con \@ pero el resultado no ha sido positivo. Al final lo he resuelto sustituyendo el carácter @ por %40

# Web proxy configuration
Acquire {
  http {
    Proxy "http://panzuela:contrasen%40@192.168.1.10:3128";
  }
}


connect (111: Connection refused)
Si obtienes este mensaje de error, una de las posibles causas es que debes establecer una conexión proxy.

 

Puppet installation and configuration

Enmarcado en el proyecto personal que estoy desarrollando desde hace unos meses, surge la necesidad de poner en marcha un sistema que permita hacer despliegues en el entorno de desarrollo, antes de llevarlo a producción. Ya dije que adelantaría un poco de información así que contamos algo. este entorno de producción está compuesto por un frontend de 4 nginx con memcached algo “tocados” además de todas las particularidades del sistema donde se ejecutan, RedHat. La solución para tenerlo todo controlado y poder manejar los despliegues fácilmente en los entornos reside en el uso de herramientas como chef o puppet (si quieres ver una comparativa entre los productos clic aquí). El que uso es puppet y vamos a ver como está montada la base. Puppet requiere conectividad con todos los nodos que comprondrán la infraestructura y estos nodos deberán conocer el nombre del servidor, así que es fundamental el servicio DNS para no perdernos con las direcciones IP y reducir los problemas, que los habrá para hacer más divertido el montaje/aprendizaje.

Comenzamos por la instalación del repositorio de puppet en el sistema de los servidores, tanto en el que ejecutará puppet master como los clientes:

[root@puppetmaster ~]# rpm -vih http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm

Configuración del servidor

Instalación del paquete puppetmaster y todas sus dependencias:

[root@puppetmaster ~]# yum install puppet-server -y

La instalación de estos paquetes generará los scrips de inicio automático en /etc/init.d que tendremos que agregar al inicio del sistema:

[root@puppetmaster puppet]# chkconfig puppetmaster on
[root@puppetmaster puppet]# chkconfig --list | grep -i pupp
puppetmaster       0:desactivado    1:desactivado    2:activo    3:activo    4:activo    5:activo    6:desactivado

Por defecto la instalación del servidor no incluye la sección [master] así que vamos a crearla e introduciremos dos directivas

[master]
    certname = puppetmaster.mfernandez.es
    autosign = /etc/puppet/autosign.conf

Ahora tenemos que decirle donde están los nodos y como se agrupan. Esto lo vamos a realizar sobre un archivo de nodos llamado nodes.pp y uno general para incluir los nodos y demás configuración, por ahora solo los nodos:

[root@puppetmaster puppet]# cd /etc/puppet/manifests
[root@puppetmaster manifests]# ls
nodes.pp  site.pp

El contenido de cada archivo es el siguiente:

[root@puppetmaster manifests]# cat site.pp
import "nodes"
[root@puppetmaster manifests]# cat nodes.pp
# ALL SERVERS
node mfernandeznodes {
    include motd
}
node 'puppetclient1.mfernandez.es' inherits mfernandeznodes {
}
node 'puppetclient2.mfernandez.es' inherits mfernandeznodes {
}
node 'puppetclient3.mfernandez.es' inherits mfernandeznodes {
}
node 'puppetclient4.mfernandez.es' inherits mfernandeznodes {
}
# # # # WEB SERVERS # # # #
node webservers {
}
node 'nginx1.mfernandez.es' inherits webservers {
}
node 'nginx2.mfernandez.es' inherits webservers {
}

# # # # DATABASE SERVERS # # # #
node nosqlservers{
}
node 'nosql1.mfernandez.es' inherits webservers {
}
node 'nosql2.mfernandez.es' inherits webservers {
}

Instalación y configuración de los clientes

Instalación del paquete puppet y todas sus dependencias:

[root@puppetclient1 puppet]# yum install puppet

Cada cliente requiere que le indiquemos cual será su nombre y para ello introduciremos en la sección [agent] del fichero de configuración /etc/puppet/puppet.conf

server = puppetmaster.mfernandez.es
certname = puppetclient1.mfernandez.es
[root@puppetclient1 puppet]# chkconfig puppet on
[root@puppetclient1 puppet]# chkconfig --list | grep -i pupp
puppet             0:desactivado    1:desactivado    2:activo    3:activo    4:activo    5:activo    6:desactivado

CentOS dispone del fichero de configuración /etc/sysconfig/puppet.conf para personalizar algunas directivas sin que tengamos que editar el fichero principal de configuración de puppet /etc/puppet/puppet.conf   En mi caso, he decidido hacerlo sobre el propio de puppet. Este es su contenido:

[root@puppetclient1 puppet]# cat /etc/sysconfig/puppet 
# The puppetmaster server
#PUPPET_SERVER=puppet

# If you wish to specify the port to connect to do so here
#PUPPET_PORT=8140

# Where to log to. Specify syslog to send log messages to the system log.
#PUPPET_LOG=/var/log/puppet/puppet.log

# You may specify other parameters to the puppet client here
#PUPPET_EXTRA_OPTS=--waitforcert=500

Iniciamos los servicios

Arrancamos el servidor y a continuación los clientes.  Recomendable un less en el log del servidor para comprobar que todo va bien. Además, en el primer cliente, será interesante arrancarlo con las opciones indicadas:

[root@puppetmaster ~]# service puppetmaster start ; less /var/log/puppet/masterhttp.log
[root@puppetclient1 puppet]# puppet agent --server=puppetmaster.mfernandez.es --verbose --test --waitforcert 10

Vamos a firmar los certificados manualmente, aunque también podemos hacer que se firmen de forma automática. A veces aparece el mensaje Notice: Did not receive certificate precisamente por no estar el certificado firmado.

[root@puppetmaster ~]# puppet cert --sign puppetclient1.mfernandez.es

Para que se firmen los certificados automáticamente hay que agregar una directiva en el bloque [master]

autosign = /etc/puppet/autosign.conf

Dentro de este fichero vamos a asegurar un poco la infraestructura impidiendo que nadie pueda meter un servidor en ella y se cargue de la configuración que reparte puppet

[root@puppetmaster puppet]# cat autosign.conf
*.mfernandez.es

Vamos a listar ahora los clientes que tenemos, incluido el servidor:

[root@puppetmaster manifests]# less /var/log/puppet/masterhttp.log 
[root@puppetmaster manifests]# puppet cert --list --all
+ "puppetclient1.mfernandez.es" (SHA256) D4:C4:2E:22:21:A4:10:22:3E:20:7F:B2:0D:C4:AF:2C:80:1F:C5:96:9D:5F:A8:8B:2D:73:30:A1:79:8F:DE:0A
+ "puppetclient2.mfernandez.es" (SHA256) 56:2D:8D:5B:42:86:5B:15:EA:2F:10:D6:B2:47:67:FD:27:A5:4F:7B:02:24:B3:C1:93:8E:87:B1:4C:0F:3E:A9
+ "puppetmaster.mfernandez.es"  (SHA256) D6:1C:35:AD:72:63:80:59:F2:4B:99:09:F6:69:C1:C7:57:3E:7D:02:A6:3F:64:5D:2D:48:AC:D1:A6:BF:48:B9 (alt names: "DNS:puppetmaster", "DNS:puppetmaster.mfernandez.es")

Ahora veamos qué podemos hacer con el “cacharro”.

Para distribuir archivos, paquetes y ejecutar acciones, debemos crear un módulo que nos permita hacer lo que necesitemos.

Los módulos su ubican en la ruta /etc/puppet/modules/ y siguen la estructura de directorios: manifests templates y files. Aunque no siempre requiere de todos los directorios, pero sí del principal, manifests.
En nuestro caso, vamos crear un archivo para distribuirlo a los clientes y nos servirá como ejemplo para ver el lenguaje usado para la construcción de estos archivos y como no, usaremos el famoso motd para el ejemplo.
El primer paso será la creación de un módulo que llamaremos motd

[root@puppetmaster modules]# /etc/puppet/modules/motd/manifests -p

Ahora vamos al directorio manifests y creamos un archivo init.pp con el siguiente contenido

class motd {
        file { "/etc/motd":
                owner   => root,
                group   => root,
                mode    => 644,
                source  => "puppet:///modules/motd/motd",
        }
}

Necesitamos colocar en el directorio files un archivo llamado motd con el contenido que deseamos mostrar en los inicios de sesión de los servidores a los que se repartirá.

[root@puppetmaster modules]# echo "Welcome" > /etc/puppet/modules/motd/files/motd

Trabajar con un sistema como puppet nos da la posibilidad de repartir software a todos los nodos o simplemente, a los nodos que deseemos. Será sobre el archivo nodes.pp creado al inicio donde tendremos que indicar sobre qué nodos tendrá que ejecutar el reparto de archivos.
reload del servidor puppetmaster

Ahora el proceso repartirá automáticamente el archivo entre los clientes que pertenezcan al grupo mfernandeznodes

Para la siguiente entrada veremos como hacer toda la infraestructura un poco más “visual”

Referencias: http://docs.puppetlabs.com/puppet/

 

Virtualbox internal connection

Configuremos VirtualBox para trabajar con nuestras máquinas virtuales de forma independiente a la red en la que nos encontremos conectados o simplemente, cuando no disponemos de una conexión de red.
Desde Archivo > Preferencias > Red agregaremos un interfaz y lo configuraremos del siguiente modo:

Captura de pantalla de 2013-05-13 18:06:47

Vamos a asignar una dirección IP al servidor, en mi caso: 10.10.10.2

Captura de pantalla de 2013-05-13 18:07:41

El DHCP asignará desde la 5 a la 10

Captura de pantalla de 2013-05-13 18:07:53

 

Ahora debemos configurar la máquina virtual para que pueda funcionar con el nuevo interfaz en modo “solo anfitrión”

Captura de pantalla de 2013-05-13 18:08:33

Pues ya lo tenemos, ahora solo configuraremos la máquina virtual para que tire de este DHCP o le asignaremos una IP fija.

 

vsftpd on CentOS 6

Vamos a montar un servidor FTP con vsftpd simple y rápidamente, GO !

Descargamos e instalamos desde el repositorio:

[mferpan@paquito ~]$ su -c 'yum install -y vsftpd'

Backup del fichero de configuración principal de vsftpd y comenzamos a editarlo:

[root@paquito ~]# cd /etc/vsftpd ; cp vsftpd.conf vsftpd.conf.orig ; vim vsftpd.conf

Visalizamos el fichero una vez terminada la edición y esto es lo que nos queda:

[root@paquito ~]# cat vsftpd.conf | grep -v ^#
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
listen=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

Arrancar el servicio vsftpd e introducirlo en el arranque del sistema, finalmente lo verificamos:

[root@paquito ~]# service vsftpd restart ; chkconfig vsftpd on ; chkconfig vsftpd –list

Abrimos el firewall:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT

No olvides recargar las reglas: service iptables reload

Para que funcione completamente:

[root@paquito ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_conntrack_ftp"

También es importante que desactivemos el login del usuario porque puede que tengamos más servicios en ejecución como por ejemplo SSH, así que en /etc/fstab lo pondremos en /bin/false o /bin/nologin

 

Reset Alfresco admin password

Tras recuperar una copia de seguridad de un Alfresco e instalarlo en el laboratorio, me he visto con un problemilla que casi siempre me pasa, olvidé la clave de admin. Buscando un poquito por google he localizado este blog con una entrada genial, ha sido copiar y pegar.

Inicia una conexión a MySQL y conecta a la base de datos de alfresco:

mysql -u alfresco -p
Si has entrado como root, ejecuta: use alfresco;

Ahor que estamos conectados a la base de datos podemos comenzar con las consultas y los updates.

SELECT anp1.node_id,
       anp1.qname_id,
       anp1.string_value as hash_pass,
       anp2.string_value as user_string
FROM alf_node_properties anp1
        INNER JOIN alf_qname aq1
           ON aq1.id       = anp1.qname_id
        INNER JOIN alf_node_properties anp2 
           ON anp2.node_id = anp1.node_id
        INNER JOIN alf_qname aq2            
           ON aq2.id       = anp2.qname_id
WHERE aq1.local_name    = 'password'
AND aq2.local_name    = 'username';

Tras ejecutar este SQL obtenemos la salida que describe el node_id de Admin y el qname_id, bastará con sustituirlos en el siguiente update:

UPDATE alf_node_properties 
SET string_value='209c6174da490caeb422f3fa5a7ae634'
WHERE 
node_id=THEADMINNODEID
and
qname_id=THEADMINQNAME

En mi caso ha servido el ejemplo propuesto (la clave que aparece aquí es admin)

UPDATE alf_node_properties 
SET string_value='209c6174da490caeb422f3fa5a7ae634'
WHERE 
node_id=4
and
qname_id=10

 

Launch applications on startup

He necesitado ejecutar gkrellm en el inicio de mi Fedora (estética pura) y lo he localizado sin querer mientras trataba de arreglar un problema con Dropbox que trataremos en un post más adelante. En el directorio ~/.config/autostart encontré dropbox.desktop y al verlo, lo he copiado y adaptado para gkrellm.

[mferpan@paquito autostart]$ cat gkrellm.desktop 
[Desktop Entry]
Name=gkrellm
GenericName=System Monitor
Comment=System Monitor
Exec=gkrellm
Terminal=false
Type=Application
Categories=Network;
StartupNotify=false

Aquí podrás localizar muchos themes para personalizarlo un poquito.

Ahora cuando arranca el sistema la aplicación se ejecuta perfectamente, ver captura

Captura de pantalla de 2013-04-21 00:52:46

Html to PDF

Ayer recibí una petición interna para crear un reporte diario sobre la visualización de algunas Webs. Como en todos los casos vamos al terminal y a mirar el repo: yum search html | grep -i pdf   Haciendo memoria recordé que ya necesité algo parecido en otra ocasión. Desde la web del proyecto podremos localizar más información sobre lo que hace wkhtmltopdf

Es un programa muy simple que no requiere hacer prácticamente nada, eso sí, trabajo con sistemas CentOS minimal y he tenido que meter algún que otro rpm del repo, pero han sido pocos.

Instalamos las dependecias (agrego -y para otra vez que lo necesite)

yum install -y qt-x11 libXrender xorg-x11-server-Xvfb bitmap-console-fonts.noarch fontconfig libXfont libXfont-devel libfontenc xorg-x11-font-utils freetype t1lib

Arrancamos el gestor de ventanas virtual y lo dejamos en ejecución, puede que sea necesario meterlo en el init con un script, depende de lo crítico que sea:

Xvfb -a -s -screen 0 1280x1024x24 :2 &

Pillamos el ejecutable:

wget -qO- http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.11.0_rc1-static-amd64.tar.bz2 | tar xjf -

No, no descargo el tar… en el server no se mete basura, para eso está tu cacharro de pruebas o un repo propio de software donde almacenar las aplicaciones que tienes en producción.

He creado un sh que me permite automatizar el proceso y enviar el reporte por mail sobre un usuario que he llamado informes, este informe tiene horientación horizontal (landscape).

#!/bin/bash
DISPLAY=:2 /home/informes/wkhtmltopdf-amd64 --orientation Landscape --javascript-delay 1200 --margin-bottom 0mm --margin-top 0mm --encoding utf-8 --no-stop-slow-scripts --use-xserver http://www.mfernandez.es /tmp/mfernandez.pdf
uuencode /tmp/mfernandez.pdf /tmp/mfernandez.pdf | mail -r ReporteWeb@mfernandez.es -s "Reporte Web --Mfernandez.es-- $(date)" manuel@mfernandez.es

chmod u+x <fichero.sh>

Para que quede “bonita” la recepción de email, he puesto la opción -r sobre el comando mail, también he puesto algunas opciones como no tener márgenes en el PDF tratando de meterlo todo en una única hoja.

Entra con el usuario informes (el que yo tengo para estas acciones, tu lo haces como quieras) y generar una tarea programada con crontab -e y después verifícala con -l

00 07 * * * /home/informes/webs/reporteWeb.sh  # Reporte Web, Cada dia a las 7 de la mañana