Provisionamiento de máquinas virtuales RedHat/Fedora/CentOS

Es una vergüenza que la manera más rápida de crear máquinas virtuales con RedHat, Fedora o CentOS sea instalar un cacharro con Debian y usar rinse.

Hagamos rewind y dejen que les ponga en antecedentes.

Si quieres meterte seriamente con el tema de la virtualización, uno de los primeros problemas con los que tienes que enfrentarte es el del provisionamiento de las máquinas virtuales. "Provisionamiento" no es más que un palabro que se inventó alguien para referirse a la creación e instalación de máquinas virtuales. Supongo que tiene algún origen razonable, pero lo desconozco.

Esto quiere decir que tienes que buscar una manera de crear máquinas virtuales que no sea cargar el virtualizador (Xen, KVM/QEMU, VMWare, lo que sea) y ejecutar todo el proceso de instalación como si fuera una máquina de verdad. "Virtualizar" no significa crearte una máquina Windows en tu escritorio para ejecutar algún juego que no puedes ejecutar en Linux. Estamos hablando de virtualización "industrial": por ejemplo, teniendo dos máquinas físicas, crear diez máquinas virtuales que van a desempeñar labores de firewalling (sí, se puede hacer en una máquina virtual; no, yo tampoco lo haría, pero hay gente para todo), servidor de correo, servidor "LAMP", servidor de aplicaciones con Tomcat, y dios sabe qué más. Y además, tienes que hacerlo rápido. Instalar todas esas máquinas de la forma tradicional te podría llevar, siendo optimistas, media hora cada una. Nuestro plan es instalarlas en cuestión de minutos, o menos.

Si han jugado un poco con estos temas, lo de instalar una máquina virtual en un par de minutos lo verán como algo razonable. Para los que no se han metido con estos temas y tienen como referencia la instalación "manual", puede parecer preposterous (absurdo, vaya). Pero es cierto: en el trabajo "provisionamos" máquinas virtuales con Debian "Lenny" en 15 segundos. Eso es sin ningún servicio, claro; lo que lleva más tiempo luego es instalarle lo que vaya a necesitar para "trabajar". Pero es un comienzo.

En Debian existe la herramienta debootstrap desde hace años. Sirve para crear chroots con Debian, originalmente para poder crear paquetes de las versiones inestables o antiguas de Debian sin tener que actualizar (o desactualizar) todo el sistema. debootstrap se baja los paquetes necesarios para instalar el sistema desde un mirror que le digamos, lo que tiene de malo que tarda un rato (dependiendo e nuestra conexión) pero tiene de bueno que son los paquetes de la distribución "real", no una base estática que pudiéramos tener guardada por ahí. Desde que han aparecido las técnicas de virtualización, es una herramienta indispensable para crear máquinas virtuales Debian. Por si no lo han usado nunca, además es facilísimo. Un ejemplo:

        debootstrap lenny /un/directorio/

O sea, que en Debian ya partíamos con ventaja cuando todo esto de la virtualización se puso de moda. Podíamos crear la base de una máquina virtual (su imagen de disco), usar debootstrap para meter ahí un sistema Debian básico, y arrancarlo. Todo en cuestión de minutos.

En Ubuntu tienen una utilidad que se llama python-vm-builder y que da el paso siguiente: además de usar debootstrap para crear el sistema básico, también crea la imagen de disco e incluso te deja (en el caso de QEMU/KVM, que es el que he probado yo) un script para arrancarla con los parámetros adecuados. O sea, que crear una máquina virtual completa, lista para correr, se reduce a esto:

        vmbuilder kvm hardy

Y luego ejecutar el script run.sh que te deja en el directorio que crea. Lo malo es que no soporta (que yo haya visto) Debian, sólo Ubuntu, pero debería ser trivial apañar algo para que lo haga. Seguro que alguien por ahí lo ha hecho ya.

Si usas Xen, mejor todavía. "De serie" viene con Debian (y Ubuntu) xen-create-image (paquete xen-tools), que es una utilidad que hace absolutamente todo lo que te hace falta para crear una máquina virtual Debian/Ubuntu para Xen de forma tan sencilla como esto:

        xen-create-image --hostname mimaquina

Hay otros parámetros que hay que configurar, pero se pueden poner en un fichero y usar eso por defecto salvo que se indique otra cosa. Se puede usar debootstrap para crear máquinas con xen-create-image, pero lo más rápido es usar un tar.gz con un sistema creado previamente, o directamente un árbol de directorios en el que hayas hecho el debootstrap previamente. Si quieres crear tropecientas máquinas con Etch o Lenny, puedes tener los árboles creados de antemano y luego usar el método copy de xen-create-image. Es así como alcanzamos el "récord" de crear una máquina virtual en 15 segundos en el trabajo. xen-create-image también crea el fichero de configuración de Xen. No tienes que hacer nada más. Permite muchas otras customizaciones que lo hacen todavía más potente, pero no me voy a meter en eso ahora.

Pues bien. Resulta que en las distribuciones RedHat, Fedora y CentOS (Suse es más comercial y ya ni hablo de ella; Mandriva ... ¿existe todavía?) no hay nada así de fácil. Por lo que he estado mirando, hay dos formas serias:

Desconozco si hay otros métodos, y si alguien lee esto y los conoce, por favor, que me los diga. Estoy escribiendo este rollo porque me parece tan increíble como ridículo que no haya algo estándar y Open Source como debootstrap/xen-create-image/vmbuilder en las distribuciones basadas en rpm.

La gran diferencia de virt-install y cobbler con los programas de antes es que el provisionamiento se basa en arrancar el programa de instalación nativo de la distribución y darle unos valores predefinidos en forma de fichero kickstart. Eso quiere decir que la instalación va por el camino que tú le has prefijado, y que quedará un sistema con las preferencias que tú le has dado. Pero sigues teniendo que pasar por todas las etapas de la instalación, aunque sea de forma desatendida (sólo tienes que sentarte a mirar cómo se instala todo, dicho de otra forma), lo que es mucho más lento que copiar ficheros (como haces con xen-create-image).

Eso sí, tanto cobbler como virt-install te permiten instalar también otros sistemas operativos. Yupi.

Pero hete aquí que en Debian, y del mismo autor de las xen-tools, hay un paquete que se llama rinse y que instala, a la debootstrap, distribuciones basadas en rpm. Hace lo que parece obvio (pero no debe serlo tanto): se descarga los rpms y los descomprime en el directorio que le digas. Ejemplo de ejecución:

        rinse --distribution centos-5 --directory /mi/directorio

No todo es juerga, claro. rinse tiene que hacer algún truco un poco sucio para acabar la instalación. Pero funciona, y es más rápido (con diferencia) que cobbler o virt-install.

O sea, que lo mejor para provisionar máquinas con distribuciones basadas en rpm es una distribución que no usa rpm como formato nativo. Oh, the irony.

Un par de comentarios

Es posible que no the hayas dado cuenta, pero estas mezclando cosas algo diferentes.

En primer lugar, cuando hablas de aprovisionar en 15 segundos, yo mas bien diria clonar. Aprovisionar va un poco mas lejos, hasta dejar la maquina en situacion operativa. Es decir, para aprovisionar un LAMP con tu tecnica, aparte de ejecutar el xen-copy-image, tendrias que instalar los elementos del stack que falten en lo que estes utilizando como base. O sea, que tardas mas de 15 segundos. Cobbler hace provisioning (virtual o fisico) en el sentido en que deja la maquina completamente lista, y como instala desde cero evidentemente tarda mas. Y realmente solo instala derivados de redhat en la version estable, aunque la de desarrollo y probable proxima release si instala sistemas de la familia de debian.

Por otro lado, ten en cuenta que debootstrap es la forma en que se instala debian en cualquier parte, no solo en un chroot. Y dado que la primera imagen para construir tu tgz la tienes que instalar a mano, la desventaja frente a instalar via kickstart no es tanta. Esa tarea te la automatiza rinse que hace lo mismo que debootstrap, aunque por lo que veo te deja sin instalar el kernel y tampoco te crea la imagen para loopback, por lo que falta trabajo manual.

Y respecto a la ultima frase, yo no se tu sistema. Pero en el que yo estoy probando rinse, y sin haberlos instalado yo de forma explicita, tengo librpm4.4 y rpm. De modo que aunque no sea nativo, rpm esta perfectamente soportado. Nunca se me ha ocurrido (hasta ahora hacer la prueba), pero sospecho que debootstrap tambien funciona en derivados de redhat, y de hecho hay un debootstrap-1.0.8-1.fc9.src.rpm

rpmbootstrap ?

rpmbootstrap ?

Umm...

Buen post! Thanks.

Saludos,

Mauro.

entonces se confirma, no?

rpm stinks y debian vuela (todavía) ;-)