Kickstart my heart

, , No Comments
Con el título de una canción de los infames Mötley Crüe (más famosos por otra canción, Dr. Feelgood) empezamos el segundo artículo de Linux Técnico. Hoy vamos a hablar del provisionamiento de equipos, usando un método que hasta hace unos años era exclusivo del mundo Red Hat pero que también podemos usar con Ubuntu: kickstart.





Provisionamiento de máquinas virtuales

Se llama “provisionamiento” a la instalación y configuración del sistema operativo de un equipo. Los casos más frecuentes para mí son los de máquinas virtuales, que es donde pruebo cosas nuevas. Si cada una tuviera que instalarla “a mano”, no estaría aquí escribiendo esto, sino esperando a que acabara la instalación de alguna de ellas. Con los años he probado varias formas de hacerlo, y de una de ellas les quiero hablar hoy: los ficheros kickstart, creados para el instalador Anaconda (usado en RH, Fedora y CentOS) pero también soportados desde hace varias “releases” por el instalador de Ubuntu.

En Debian no está soportado. Hubo un intento, hace años, de modificar el instalador para que lo soportara. Pero se quedó en eso: un intento. Es triste que Ubuntu lo soporte y Debian no, porque para bien o para mal, la instalación mediante kickstart es un estándar “de facto”. A uno se le ocurren varias razones para que esto sea así, casi todas de índole política (“Red Hat es el Mal”) o religioso (“Ubuntu es el Mal”). Pero como siempre, lo bueno y malo de Debian es que la mayoría manda; y si la mayoría de desarrolladores no tiene interés en que Debian soporte kickstart, sin kickstart nos quedamos.

Los ficheros kickstart son ficheros ASCII, que podemos crear o modificar con cualquier editor de texto. Tienen una sintaxis especial que sirve para que el instalador sepa qué valores aplicar en las distintas fases de la instalación: cómo particionar el disco, qué tarjetas de red configurar y cómo, qué usuarios crear y con qué contraseñas, qué paquetes instalar, etc.

Si todo va bien, la instalación es completamente automática: lanzas el instalador, le dices cómo obtener el fichero kickstart, le das a Enter, te vas a tomar un café, y al volver la máquina ya está instalada. Si ocurre algo durante la instalación (no hay suficiente espacio en disco, alguno de los paquetes que quieres instalar no está disponible, no se detecta la tarjeta de red, etc.), tendrás que arreglarlo y volver a empezar. Podrías seguir la instalación a mano desde donde falló kickstart, pero no suele merecer la pena.

Una máquina virtual mínima, suponiendo que el equipo que la alberga no es demasiado viejo, puede estar provisionada en unos 10 o 15 minutos. A mejor hardware (sobre todo, E/S de disco), más velocidad. Nunca me he puesto a cronometrarlo, pero yo diría que es difícil bajar de los 10 minutos. Si alguien ha conseguido menos, por favor, que lo diga en los comentarios.

En cualquier caso, la ventaja no es la velocidad en sí, sino poder hacer la instalación de forma desatendida. Combinado con arranque por PXE, puedes instalar una máquina por red, de forma totalmente automatizada. Hay productos Open Source como Cobbler y xCAT que se basan precisamente en esto.

Algo como kickstart es fundamental si tienes que mantener una granja de servidores, y abre la puerta a posibilidades como cambiar el rol de un servidor y reinstalarlo en un tiempo récord, para adaptarte a las demandas que tengas en ese momento.

Sintaxis de un fichero kickstart

Lo mejor es empezar viendo un ejemplo:


lang es_ES
langsupport es_ES
keyboard es
mouse
timezone Europe/Madrid
rootpw --disabled
user robe --fullname "Roberto" --iscrypted --password $1$K4dyxS0.$LSrit.62Bu5InynRAwYYk1
reboot
text
install
cdrom
bootloader --location=mbr
zerombr yes
clearpart --all --initlabel
part /boot --fstype ext4 --size 256 --asprimary
part swap --size 512 --asprimary
part / --fstype xfs --size 1 --grow --asprimary
auth  --useshadow  --enablemd5
network --bootproto=dhcp --device=eth0
firewall --disabled
skipx


Este es un fichero de kickstart creado para Ubuntu. Para RH y demás familia debería valer igual, aunque no estoy seguro de que no haya algún detalle diferente. Para ver las diferencias entre el kickstart de Ubuntu y RH, pinchad
aquí.

Todo es bastante obvio: se configura el sistema en español, con instalación en modo texto; se selecciona el CD como fuente de los paquetes para la instalación; se instala el gestor de arranque en la MBR; se borran la MBR y la tabla de particiones; se configura una partición para boot, otra para swap y otra para el resto del sistema; se usan “shadow passwords” y MD5 para las contraseñas; se configura eth0 por DHCP; se deshabilita el firewall; y no se configuran las X.

Como es costumbre en Ubuntu, el usuario root no tiene contraseña (rootpw --disabled), y por eso configuro un usuario (“robe”). Será añadido al grupo “admin”, y tendrá acceso de root mediante sudo. La contraseña se indica en el fichero en forma de hash MD5 (aunque podría ser también en el formato crypt).

Los hombres muy hombres, los verdaderos gurús, los hackers y los programadores de COBOL o LISP crearán estos ficheros a pelo, con un editor de texto. Yo, que soy de natural humilde y algo tímido, usé system-config-kickstart (que en Ubuntu viene en el paquete homónimo), un programa gráfico. Las modificaciones pequeñas las hago con un editor de texto, pero el “heavy lifting” de la creación del fichero siempre la hago con este programa. Cubre todas las secciones y permite modificar cualquier aspecto de la instalación que pudiéramos configurar a mano.

Cómo usar nuestro fichero kickstart

El instalador de Ubuntu (o lo que sea que estemos usando para las pruebas) carga el fichero kickstart mediante http. Al arrancar, en lugar de seleccionar “Install Ubuntu”, seleccionamos “Other options”. Se nos mostrará la línea de argumentos que se le van a pasar al instador, que termina en “quiet --”. Yo suelo quitar el “quiet”, porque me gustan los mensajes del kernel por la mañana (huelen a victoria); pero lo único que hace falta, estrictamente, es quitar los dos guiones (“--”) y añadir esto:

ks=http://192.168.1.101/ks.cfg

192.168.1.101 es la dirección IP del equipo desde el que voy a cargar el fichero kickstart, ks.cfg. Como uso VirtualBox, lo que hago es instalar un servidor http pequeñajo en el anfitrión (el equipo que ejecuta VirtualBox) y copiar el fichero kickstart a /var/www (o donde esté el document root).

La instalación se ejecutará hasta el reinicio final, y en unos minutos tendremos la máquina instalada y funcionando. En Ubuntu, el hostname de las máquinas creadas con kickstart siempre es “kickseed”. Se puede cambiar en el fichero kickstart, en la configuración de red, pero como lo uso como plantilla para máquinas de distinto pelaje, lo cambio siempre después de la instalación.

Secciones %pre y %post

En las secciones %pre y %post, que van al final del fichero, podemos añadir comandos a ejecutar antes o después de la instalación. No he usado la parte de %pre, pero sí la de %post: hice unas pruebas en las que instalaba una máquina con kickstart, y luego completaba la instalación instalando y ejecutando puppet. Perdí el fichero de configuración cuando uno de mis discos duros se hizo el hara-kiri, pero era algo así:

%post
apt-get update
apt-get -y install puppet
puppetd --verbose --server puppet.mired.pri --onetime
%end

Estos comandos se ejecutan dentro del chroot del sistema instalado, pero también podemos ejecutar comandos fuera de él. Para eso tenemos que añadir “--nochroot” a “%post”. Copio tal cual el ejemplo de la referencia de Fedora:

%post --nochroot
cp /etc/resolv.conf /mnt/sysimage/etc/resolv.conf
%end

Esto no funcionaría en Ubuntu, porque el sistema instalado está montado bajo /target y no /mnt/sysimage. Pero es un ejemplo bastante claro de lo que se podría hacer.

Soluciones integradas

Si vamos en serio con esto de provisionar muchas máquinas con kickstart, lo mejor es usar un sistema integrado, como los mencionados xCAT o Cobbler. Con ellos podremos hacer provisionamiento desde bare metal, suponiendo que soporta PXE, con sólo conectar la máquina a la red y encenderla. Integran varias piezas:

- Un servidor DHCP
- Un servidor DNS
- Un servidor TFTP
- Un servidor web

También podemos tener ya instalados estos servicios, y sólo modificar la configuración para que funcionen con los sistemas de provisionamiento. Depende de las necesidades de cada uno.

Con este tinglado, lo único que tendríamos que hacer es dar de alta la MAC de la máquina y decir qué vamos a instalar en ella. Una vez que la encendiéramos, el proceso sería el siguiente:

- La máquina enciende, conectada a la red en la que está el sistema de provisionamiento
- El agente PXE de su tarjeta de red recibe una IP por DHCP
- Con la información DHCP, también recibe la IP del servidor TFTP del que bajarse un kernel y un initrd
- Se descarga por TFTP el kernel y el initrd (que no es más que el instalador), y lo ejecuta con los parámetros adecuados para cargar la configuración con kickstart
- El instalador provisiona la máquina según lo indicado en kickstart
- Con la información DHCP también puede haber recibido su propio hostname, así como su dominio, servidores DNS, etc.
- Se termina la instalación, se reinicia la máquina, y ya tenemos un nuevo equipo configurado

La primera vez que ves un sistema de estos funcionar, es mágico. Te quedas mirando a la pantalla sin acabar de creerte del todo que va a funcionar. ¡Pero lo hace! Maravillas de la informática.

Conclusión

Uno piensa que esto de provisionar máquinas no le hace falta, porque lo único que hace es instalar alguna de vez en cuando. Pero luego te hace falta para, yo qué sé, escribir un artículo cada mes. Y lo de instalar una máquina virtual cada vez, o reutilizar una que ya tienes, se vuelve tedioso. Así que buscas soluciones que te permitan instalar una máquina en poco tiempo, o al menos de forma desatendida.

Ahora ya no uso kickstart, porque he descubierto los VDIs “multiattach” de VirtualBox. Pero para crear esos VDIs, o para otras máquinas que instalo casualmente, kickstart sigue siendo la mejor herramienta.

0 comentarios:

Publicar un comentario