jueves, 2 de enero de 2014

Python, Celery y colas....sobre todo colas --Part1--



Empezamos a tocar un poco de Python, Celery y Rabbit, lo primero de todo, contexto:

Día 2 de Enero de 2014, frio, en el curro no curra ni el tato, pues bien hoy toca mirar documentación y sobretodo con tranquilidad.

Esto ha surgido por la siguiente razón, el otro día estaba pegandome con Django y llegue al punto de necesitar un event pool  o un gestor de colas para después con Fabric atacar a varios nodos a la vez, que no se pisen y organizar la información un poco. En vez de el pool de eventos me decante por esta opción por la sencilla razón que soy Sysadmin y esta en mi naturaleza, ademas de que es un tema pendiente que llevo posponiendo varios meses.

Empezamos, el SO, vamos a trabajar sobre una RedHat/CentOS 5.5...direis..why?, por que es el SO que suelo usar en el curro para todo, podría usar una 6 pero me interesa especialmente la 5.5 por que la mayoría de ellos tienen dicha version.

Version de Python a utilizar 2.6, si tenéis el repo epel, instalad "python26" así es como se llama el RPM, instaladlo con el setuptools para el tema de pip y demás.

Después pip-python install celery (aseguraos que pip tira de python 2.6 y no de la 2.4 que es la que esta por defecto en el SO), sino os quereis liar, easy_install-2.6 celery y ya.

Vale, con esto ya tenemos Python2.6 y Celery instalado, ahora necesitamos un broker, vamos con RabbitMQ, aquí tuve alguna historia sobre todo por desconocimiento, nunca había instalado una Rabbit y claro.. para que la instalación no este muy anticuada yo he metido la version 2.8.5-1. Para ellos haced lo siguiente, encontrar el RPM es trivial así que no me lio con eso:

 yum install rabbitmq-server


Bueno, Rabbit tiene unos plugins bastante chulos, entre ellos una interfaz web bastante aceptable y sin boton de deslogueo (eso me toco bastante el bajo vientre xD), pero en esta version de Redhat y en el repo Epel solo tenemos la version 2.2 de RabbitMQ y la version 12B de Erlang, una de las dependencias necesarias para que estas cosas chulas funcionen, vale pues llego el momento de saltarnos el procedimiento, buscamos el rpm de la version 2.8.5-1, como he dicho eso es bastante simple, en rpmfind o sitios similares los tenéis.

Ahora instalamos el repo de Erlang, por que necesitamos minimo la version 13B para levantar la web de administration:

 wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo
 yum clean all
 yum install erlang

nos instalará 800 millones de rpms (61 a mi xD) y demás, vosotros dadle a si (a no ser que necesitéis alguna version concreta para algún elemento concreto en desarrollo, pero ahi ya no entro). Tras un cafe podemos empezar a trabajar.

Activamos el plugin de administracion:

 rabbitmq-plugins enable rabbitmq_management

E iniciamos el servidor de RabbitMQ:

 /sbin/service rabbitmq-server start 

ahora nos vamos con el navegador a la IP de vuestro servidor y concretamente al puerto 55672, es el mismo que el de Rabbit pero con otro 5 delante, y ale ya tenemos la base para poder trabajar.

Podeis acceder como guest/guest y a partir de ahi gestionar los usuarios como queráis.

Mirad que no tengais IPTABLES levantadas o SELinux por ahi rondando.

En los siguientes post iré entrando mas en código para gestionar los workers de Celery desde python.
Espero que os haya sido util.

Sources:
 - How to install erlang: http://pubs.vmware.com/vfabric51/index.jsp?topic=/com.vmware.vfabric.vas.1.0/vas/erlang-install.html
 - Management plugin RabbitMQ: http://www.rabbitmq.com/management.html


martes, 17 de septiembre de 2013

Entrada Flash - Lxpanel/Mint/Openbox

Buenas gente del norte de Gondor!!! heeeey.....estuve durante un tiempo con Mint instalado en el portátil del curro y quieras que no pues hay cosas que me revientan de LXDE, una de ellas el panel, harto ya de que a su bola se bloqueara dicho panel me hice un pequeño script de inicio/stop adaptado al profile del usuario, aquí os lo dejo:

https://gist.github.com/padajuan/5524459

Con suerte os sirve ;)

jueves, 22 de agosto de 2013

Generador Masivo de certificados



Soy noooormal!!! gritaba en un bar hace unos días con unos colegas, mentira cochina xD....buenos días gente decente e indecente, el otro día tuve que hacerme unos scripts en bash para el curro con el fin de generar certificados de forma masiva, me parece algo bastante útil, ya que son comandos que ejecutas 1 vez o 2 como mucho y te olvidas...

No es nada del otro mundo, simplemente ahorra tiempo aquí os dejo el repositorio del susodicho:

https://github.com/padajuan/Cert-nerator

bueno, realmente es un poquito mas que eso, es un bundle que básicamente se nutre de un archivo de configuración externo al del sistema, registra aquellos certificados expedidos y firmados dentro del fichero index.txt, con el fin de llevar un seguimiento.

Necesitas un par de pasos previos para generar la Key y la CA, pero después ya le puedes dar candela. 

Las instrucciones están en el README.md del propio repo, con un poco de suerte incluso a alguien le puede ser útil :)

También quiero agradecer a fmartingr ese cable de ultima hora ;), ty bitch

martes, 20 de agosto de 2013

Entrada Flash - Como saber que CA hay cargadas en un Balanceador con cifrado SSL

Hola gente!, os traigo un comandillo útil que os puede venir bien si necesitáis saber las CAs que hay cargadas en un balanceador/servidor/w/e y conectáis con el a través de un certificado emitido por esa CA:

 openssl s_client -connect  ip:puerto

La salida es bastante grande, pero lo importante es lo que viene despues de esto:
  Acceptable client certificate CA names

Espero que os haya servido ;)

lunes, 29 de julio de 2013

Entrada Flash - Openssl

Buenas a todos queridos televidentes...;), a modo de recordatorio un par de comandos utiles de OpenSSL:

Extraer la Key privada de un PFX
- openssl pkcs12 -in CertPKCS12.pfx -nocerts -out Cert.key

Extraer el Certificado de un PFX
- openssl pkcs12 -in CertPKCS12.pfx -clcerts -nokeys -out Cert.pem

Quitar el Password de una Key:
- openssl rsa -in Cert.key -out Cert_1.key

Espero que os sea util...esto lo encuentras por los internets facilmente pero como siempre se me olvida, me sirve para ubicarlo facilmente ;).

martes, 12 de marzo de 2013

Entradas Flash

A las buenas, voy a crear este tipo de entrada para agregar comandos, utilidades y demas cosas que me vaya encontrando por ahi que puede ser util para vosotros, aqui os dejo la primera:

cat access.log | awk '{print $1}' | sort |uniq -dc

En un access.log donde el campo 1 es la ip de origen te dice el numero de peticiones que tiene cada ip de origen, es una chorrada util ;)

jueves, 12 de enero de 2012

Como montar un Cluster de MongoDB con 4 Nodos

Bueno, después de una temporada con mucho curro vuelvo con cositas nuevas y frescas, voy a explicaros como montar un cluster de MongoDB para entornos de producción.
Para empezar vamos a contar con 4 nodos a los que vamos a llamar Frodo, Sam, Pipin y Merry...si exacto soy un jodido friki xDD. Para hacer mas fácil levantar los servicios y demás lo mejor es usar configuración de demonios basada en archivos viene a ser mas o menos lo mismo que el comando en crudo, pero de esta manera alguien que no tenga mucha idea, puede levantar los servicios mientras tu te rascas la parte baja de los genitales xD.

Vamos a empezar con el Replica Set, que en resumen es, un cluster Maestro-esclavo inteligente, si se cae un nodo, hace otro de ellos se hace maestro y toma el control de la situación. Se van a llamar Agny y Rudra...que si que soy un puto friki...xDD

Frodo
mkdir -p /var/lib/mongo/agny /var/lib/mongo/rudra
mongod --dbpath /var/lib/mongo/agny --port 10000 --replSet agny
mongod --dbpath /var/lib/mongo/rudra --port 11000 --replSet rudra --oplogSize 1


Pipin
mkdir -p /var/lib/mongo/agny
mongod --dbpath /var/lib/mongo/agny --port 10000 --replSet agny


Sam
mkdir -p /var/lib/mongo/agny /var/lib/mongo/rudra
mongod --dbpath /var/lib/mongo/agny --port 11000 --replSet agny --oplogSize 1
mongod --dbpath /var/lib/mongo/rudra --port 10000 --replSet rudra

Merry
mkdir -p /var/lib/mongo/rudra
mongod --dbpath /var/lib/mongo/rudra --port 10000 --replSet rudra

Con estas instrucciones puestas cada una en su correspondiente servidor, lo que hacemos es preparar el terreno, estamos organizando el espacio donde se va a dejar los archivos de la DB, y despues levantamos los correspondientes demonios en cada servidor.

Ahora vamos a conectarnos a Frodo para cargarle la configuración..


mongo Frodo:10000/admin

> rs.initiate({"_id" : "agny", "members" : [
... {"_id" : 0, "host" : "Frodo:10000"},
... {"_id" : 1, "host" : "Pipin:10000"},
... {"_id" : 2, "host" : "Sam:11000", arbiterOnly : true}]})

Y ahora a Sam...

mongo Sam:10000/admin

> rs.initiate({"_id" : "rudra", "members" : [
... {"_id" : 0, "host" : "Sam:10000"},
... {"_id" : 1, "host" : "Merry:10000"},
... {"_id" : 2, "host" : "Frodo:11000", arbiterOnly : true}]})


Tarda unos segundos y ale ya tienes tu Set de hobbits replicados, lo bueno que tiene esta configuración es que los que actúan de árbitros hacen que en caso de caída no se pierda funcionalidad en la aplicación, ademas de que no vas a tener 2 maestros concurrentes en ningún servidor nunca.

Ahora las Shards, vamos a montar 2 y vamos a volcar la configuracion en Sam, Pipin y Merry


Pipin
mkdir /var/lib/mongo/config
mongod --dbpath /var/lib/mongo/config --port 20000

Sam
mkdir /var/lib/mongo/config
mongod --dbpath /var/lib/mongo/config --port 20000

Merry
mkdir /var/lib/mongo/config
mongod --dbpath /var/lib/mongo/config --port 20000
mongos --configdb Pipin:20000,Sam:20000,Merry:20000 --port 30000

Ahora nos conectamos al puerto 30000 de Merry y configuramos la Shards

> mongo Merry:30000/admin

> db.runCommand({addshard : "agny/Frodo:10000,Pipin:10000"})
{ "shardAdded" : "agny", "ok" : 1 }
> db.runCommand({addshard : "rudra/Sam:10000,Merry:10000"})
{ "shardAdded" : "rudra", "ok" : 1 }

Ale a correr, ya tenemos el cluster montado, ahora vuestra aplicación debe apuntar al proceso mongos, bueno realmente lo mejor es montar un proceso mongos por nodo de aplicación y que así apunten a Localhost:puerto.

Espero que os haya servido de ayuda, esta info la he sacado de un par de libros y de el blog http://www.snailinaturtleneck.com/blog.