Ene 20 2009

Ejemplo práctico Cfengine: Actualización masiva de PHP

Categoría: Administración Centralizada, LinuxSanti Saez @ 12:41

Tengo prácticamente acabado un post a modo de introducción a los sistemas de administración centralizada + automatización (Cfengine, Puppet, Spacewalk, etc..), mientras tanto iré comentado casos reales donde estos sistemas me han parecido realmente útiles e interesantes. A modo de ejemplo, empiezo explicando -a grandes rasgos- el método que utilizamos en Hostalia para actualizar PHP en la plataforma de alojamiento compartido, un cambio que afecta a más de 60.000 dominios distribuidos en unos cuantos cientos de servidores.

Ante un escenario así, donde la máxima de las leyes de Murphy siempre se cumplirá, no podemos actualizar todos los servidores en bloque y tampoco podemos actualizarlos manualmente uno por uno sin saber que pasará: necesitamos un método flexible, totalmente automatizado, que nos alerte de posibles errores antes de que lleguen al usuario, con un método sencillo de rollback para volver al estado anterior a la actualización, y por supuesto, todo ello sin cortes y totalmente transparente para los usuarios. Aquí es donde Cfengine nos ayuda día a día en este tipo de tareas ;-)

Vamos “directos al grano” y analizamos el fragmento de la configuración de Cfengine que se encarga de esta tarea:

- La definición de clases o grupos es una de las características mas potentes a la hora de trabajar con cualquier sistema de administración centralizada, permiten agrupar servidores sobre los que realizar una acción común, por ejemplo: podemos tener servidores bajo clases con nombre “PHP4″, “PHP5″, etc.. para diferenciar servidores que ejecutan diferentes versiones de PHP.

- Cfengine define internamente una serie de clases (Sistema Operativo, arquitectura, versión del kernel, distribución Linux, etc…), permitiendo además que el usuario pueda gestionar nuevos grupos y realizar operaciones sobre ellas: sumas de grupos, exclusiones, etc… por ejemplo, podemos agrupar las clases PHP4 y PHP5 bajo la clase PHP, para realizar una acción común sobre ellas, por ejemplo sincronizar el fichero de configuración php.ini en todos las máquinas que pertenezcan a este grupo. Recomiendo la lectura del documento de Jeremy Mates sobre las clases en Cfengine, una buena definición de grupos/clases será un punto clave para el éxito de cualquier sistema de administración centralizada.

- Para simplificar, en este ejemplo vamos a trabajar únicamente con dos clases: PHP5 y TESTING. El grupo “PHP5″, como podemos intuir, contiene el grupo de servidores que ejecutan la versión 5 de PHP, y la clase “TESTING” agrupa aquellas máquinas donde vamos a actualizar PHP de forma “controlada” (desde la versión 5.2.6 a la 5.2.8, nos saltamos la versión 5.2.7 ya que introducía una regresión en el tratamiento de las “magic quotes”). De la combinación de estos dos grupos nacen dos nuevos entornos: PHP5.!TESTING con servidores que seguirán ejecutando la versión 5.2.6 y PHP5.TESTING que tendrá los servidores que serán actualizados a la versión 5.2.8. En Cfengine el operador “.” suma las máquinas de una clase y “!” es el operador de negación.

- En Cfengine es posible agregar servidores a grupos de muchas formas, una de ellas es con la directiva FileExists. En el ejemplo, tras hacer un touch del fichero /etc/cfengine/testing el servidor pasará a formar parte de la clase “testing”, es decir, será un candidato a actualizar desde la versión 5.2.6 a 5.2.8 de PHP “automágicamente” ;-)

- A partir de aquí tendremos dos flujos de ejecución en Cfengine: máquinas que no se verán afectadas por la actualización y las que pasarán a actualizar PHP. En cualquier momento es posible pasar de un estado a otro, con tan solo crear o borrar el fichero /etc/cfengine/testing.

- ¿Que pasa si una máquina entra en estado “testing” Cfengine instalará la nueva versión del módulo DSO para Apache de PHP, sustituyendo para ello el fichero libphp5.so. Para mayor flexibilidad en Hostalia compilamos PHP, así no dependemos de paquetes/compilaciones de terceros, y además así podemos personalizar las funcionalidades, aplicar parches, etc.. En cualquier caso, el proceso de actualización podría ser cualquier acción: actualizar PHP con el módulo de gestión de paquetes del propio Cfengine, con independencia de si estamos sobre una Debian, CentOS, Solaris, FreeBSD, etc..

- Además, si está definida la clase testing se modifica la configuración de PHP para enviar los errores por syslog a una máquina remota, donde los logs están centralizados en un servidor con syslog-ng. En un escenario de shared hosting con gran volumen de dominios, es muy habitual que PHP esté constamente reportando errores, por lo que algunos patrones los ignoramos directamente (ver fragmento con las regex), para dedicar la atención a aquellos que lo necesitan y pueden llegar a ser realmente graves. Desde un único punto podemos analizar “en vivo” lo que ocurre en las máquinas en estado “testing”, dejando a un lado las máquinas estables que tienen todavía la versión anterior de PHP. Por defecto, PHP envía a syslog los mensajes con el servicio y prioridad user.notice (ver la función php_syslog en main/main.c), si la queremos modificar el parche para hardening de PHP Suhosin permite personalizar este comportamiento de logging.

- Solo si se realiza cualquiera de las dos acciones anteriores (copiar el fichero libphp5.so y/o php.ini) se define la variable restart_apache en Cfengine: el resto de servidores no se verán afectados.

- Si la variable restart_apache está definida, se hace un reinicio graceful de Apache para evitar cerrar las conexiones establecidas en ese momento. Los procesos que estén con la versión anterior de PHP una vez terminen de ejecutarse pasarán a tener la nueva versión sin corte, esto es necesario para evitar cualquier corte en el lado cliente.

Al tener los errores de PHP de la nueva plataforma centralizados en un único punto es muy sencillo detectar cualquier problema y automatizar acciones ante determinados errores, por ejemplo: si aparece la cadena “segmentation fault” en los logs de Apache, podemos forzar un rollback automático a la versión anterior de PHP, con alguna herramienta de análisis de logs tipo swatch, etc.. con tan solo borrar el fichero /etc/cfengine/testing.

Cuando consideremos el cambio lo suficientemente maduro como para aplicarlo a todos los servidores en producción, podremos llevarlo acabo con unos pequeños cambios en la configuración de Cfengine, básicamente borrando las referencias a la clase “testing”.

Conclusión: el sistema de clases/grupos de Cfengine es uno de sus puntos mas potentes, en este caso nos ha proporcionado un método de actualización + rollback sencillo para actualizar un componente en un determinado grupo de servidores, sin afectar al resto de servidores.. un método flexible, fiable y sin cortes para una operación crítica, todo ello con apenas 20 líneas de código y dedicándole unos pocos minutos de atención :-)

Etiquetas: ,


Oct 30 2008

Instalación remota de CentOS por VNC

Categoría: LinuxSanti Saez @ 9:28

Una de las cosas que me gusta de las distribuciones basadas en Red Hat es que todas ellas utilizan el instalador Anaconda junto a los ficheros Kickstart para realizar instalaciones desatendidas. Hasta ahora es uno de los sistemas mas flexibles y potentes que conozco para automatizar instalaciones Linux.

Debian Installer quizás pueda ser mas potente en determinados escenarios, aunque en general elaborar un buen fichero preseed para una instalación desatendida de Debian pueda ser algo mas laborioso… Anaconda, destaca además por ser muy sencillo.

Pero hoy el protagonista es Anaconda y su módulo de instalación remota por VNC.. ya hablaremos en otro momento del resto de instaladores ;-)

¿Cuando nos puede interesar instalar remotamente Linux por VNC?

- El servidor a instalar no tiene pantalla, teclado, ratón, unidad de CD/DVD, puerto USB.. una instalación por VNC será mas cómoda, rápida y económica que utilizar un dispositivo KVM sobre IP, puerto serie, etc..

- Instalación de otra distribución. Muchos ISP entregan los servidores dedicados con una determinada distribución Linux sin posibilidad de elegir otra y/o personalizar algunos parámetros que solo se pueden hacer durante la instalación, por ejemplo, el esquema de particiones.

- Actualizaciones. Todas las distribuciones basadas en Red Hat se recomienda actualizarlas desde Anaconda utilizando el método upgradeany. Por ejemplo, podemos arrancar por VNC para actualizar remotamente desde CentOS 4 a CentOS 5 de forma cómoda sin necesidad de CDs, arranque por PXE, etc..

- Seguimiento y depuración de una instalación desatendida con Kickstart, así podremos ver “en vivo” que está ocurriendo en todo momento por VNC.

- El sistema VNC es multiplataforma: existen implementaciones para prácticamente todos los Sistemas Operativos, incluso clientes en Java que podríamos incrustar en algún herramienta de gestión web tipo Spacewalk.

Lógicamente en todos estos casos podríamos utilizar Kickstart para realizar una instalación totalmente desatendida sin necesidad de interactuar en ningún momento por teclado/ratón/pantalla y todos los problemas anteriores quedarían resueltos, pero el objetivo es tener una conexión VNC con el servidor que estamos instalando.

La conexión remota por VNC con el instalador Anaconda puede realizarse de dos formas:

- Servidor: la máquina a instalar arranca un servidor Xvnc y nosotros nos conectamos a el utilizando un cliente VNC, es la configuración mas utilizada (parámetros vnc y vncpassword).

- Cliente: en nuestro escritorio levantamos un cliente VNC en modo “listen” y Anaconda se conectará a nosotros (parámetros vnc y vncconnect). En algunos casos puede ser una configuración mas segura, pero resulta mas problemática si estamos bajo un firewall, NAT, etc..

Como ejemplo vamos a modificar el GRUB de una Debian para instalar remotamente CentOS 5 por VNC, los pasos a seguir son:

- Descargar los ficheros initrd.img y vmlinuz de la imagen PXE de CentOS (pxeboot) en el directorio /boot/centos, o en cualquier otro directorio, evitando sobreescribir los actuales:

mkdir -p /boot/centos ; cd /boot/centos
wget http://mirror.centos.org/centos-5/5/os/i386/images/pxeboot/initrd.img
wget http://mirror.centos.org/centos-5/5/os/i386/images/pxeboot/vmlinuz

- Editar la configuración de GRUB, fichero /boot/grub/menu.lst, y añadir la siguiente entrada. Lógicamente será necesario personalizar la configuración de red o bien utilizar DHCP (parámetro ip=dhcp):

title Instalación CentOS 5 por VNC
root (hd0,0)
kernel /centos/vmlinuz vnc vncpassword=password ip=192.168.0.2 netmask=255.255.255.0 gateway=192.168.0.1 dns=192.168.0.1 method=http://mirror.centos.org/centos/5/os/i386
lang=en_US keymap=us ksdevice=eth0
initrd /centos/initrd.img

- Comprobamos que la entrada default de GRUB es la correcta, y reiniciamos el servidor.

- En el siguiente arranque GRUB cargará el kernel + initrd con los parámetros indicados, iniciando así la instalación con Anaconda.

- Anaconda descarga la imagen stage2.img desde el mirror indicado. Este archivo está comprimido con SquashFS y contiene todo lo necesario para arrancar el instalador gráfico, ocupa unos 90MB así que dependiendo de la conexión este paso puede durar unos minutos..

- Anaconda arranca el servidor Xvnc e inicia una instancia del gestor de ventanas mini-wm, en la consola del servidor aparecerá el mensaje:

Starting VNC..
The VNC server is now running.
Please connect to 192.168.0.2:1 to begin the install...
Press for a shell
Starting graphical installation..
XKB extension not present on :1

- Listo!! Utilizando un cliente VNC nos conectamos al display 1, puerto 5901/tcp, para empezar a instalar el servidor normalmente, como si estaríamos delante de el :-)

Etiquetas: , , ,


Oct 21 2008

Configuración de un iniciador iSCSI en Linux

Categoría: Almacenamiento, LinuxSanti Saez @ 0:16

Virtualización, red de almacenamiento, Cloud Computing, etc.. ¿Cuantas veces has oído hablar de estos términos en los últimos meses? Si trabajas en el mundo de la Informática/Sistemas seguro que a diario. Al menos en mi caso, toda la documentación que llega a mis manos hace alguna referencia a estas tecnologías. No creo que te descubra nada nuevo, y si no es así, tampoco hace falta que te lo creas.. puedes utilizar como referencia la aplicación Trends de Google para analizar la tendencia de estas tecnologías en los últimos años: las búsquedas, y por lo tanto el interés general de los usuarios, se han disparado.

Además, casi siempre se habla de redes de almacenamiento basadas en iSCSI, ¿Casualidad? Lógicamente, no.

Antes de empezar a hablar sobre iSCSI, deberíamos consultar la historia de su “padre”: SCSI. Hoy en día, SCSI se considera un conjunto de protocolos e interfaces que permite la comunicación entre dispositivos, generalmente de almacenamiento de datos (discos, cabinas, cintas, etc..). Diseñado hace ya mas de 20 años, para atender las necesidades de los entornos mas profesionales, no fue pensado para el escritorio o usuario doméstico. Desde su nacimiento no ha parado de evolucionar, y seguimos utilizando a diario algunas de sus “mutaciones”: Firewire, SAS, Fiber Channel, Infiniband, etc.. La historia de SCSI es un claro ejemplo de como evoluciona la Informática para adaptarse a los nuevos tiempos, renovarse o morir.

La última gran re-evolución de SCSI es iSCSI = Internet + SCSI.

iSCSI es tan solo una de las muchas evoluciones de SCSI: en lugar de utilizar hardware específico (cableado, conectores, HBAs, etc..), podemos usar los componentes de una red TCP/IP “clásica” para conectar dispositivos utilizando comandos SCSI y crear así una red de almacenamiento (SAN), es decir, la alternativa low-cost a Fiber Channel.

Entonces, si se sigue utilizando TCP/IP para conectar dispositivos.. ¿Cuál es la diferencia entre una NAS donde se utiliza NFS y/o CIFS y una SAN iSCSI? Fácil, cuando utilizamos sistemas de ficheros tipo NFS, CIFS, etc.. tenemos un servidor que está exportando una estructura de directorios, y es este servidor quien se encarga de controlar las lecturas/escrituras a los datos, por ejemplo, una máquina Linux con Samba donde se conectan X clientes. En una SAN con iSCSI, seguimos utilizando redes TCP/IP, pero en este caso el target/servidor está exportando un dispositivo de datos (raw disk). A efectos del Sistema, sería lo mismo que conectar directamente un disco duro: tendremos que crear particiones, utilizar un sistema de ficheros.. y como ya veremos poco a poco, esto será una gran ventaja para determinados escenarios.

Dejando a un lado la teoría.. y si volvemos a utilizar Trends de Google para analizar el impacto de iSCSI, vemos que desde sus inicios ha sido mas popular que su rival Fiber Channel. Lo curioso es que, a pesar de ser una tecnología en pleno crecimiento, existe muy poca documentación sobre iSCSI, y sobre todo en castellano.

Por esta razón y aprovechando mi estreno como “blogger”, me he animado a escribir una serie de artículos sobre iSCSI. Trataré desde los temas mas básicos como la configuración de un iniciador, montar un target por software utilizando Openfiler, arrancar un servidor desde un volumen iSCSI, etc.. hasta temas algo mas complejos como alta disponibilidad de almacenamiento, seguridad, sistemas de ficheros para clusters, etc.. hasta ir montado y analizando poco a poco todos los elementos, ventajas y desventajas de una SAN iSCSI.

Empezamos con la parte mas sencilla de todas, configurando un cliente iSCSI en Linux utilizando el software Open-iSCSI. El manual está en el Wiki: Configuración de un iniciador iSCSI en Linux.

Etiquetas: , , ,