Product SiteDocumentation Site

12.3. Instalación automatizada

Los administradores de Falcot Corp, como muchos administradores de grandes servicios IT, necesitan herramientas para instalar (o reinstalar) rápidamente, y automáticamente si es posible, nuevas máquinas.
Un amplio rango de soluciones pueden satisfacer estos requisitos. Por el otro lado, herramientas genéricas como SystemImager lo hacen creando una imagen basada en una máquina patrón y luego desplegando dicha imagen en los sistemas objetivo; en el otro extremo del espectro, el instalador Debian estándar puede ser presembrado con un archivo de configuración que provee las respuestas a las preguntas realizadas durante el proceso de instalación. Como un tipo de punto medio, una herramienta híbrida como FAI (instalador completamente automático: «Fully Automatic Installer») instala los equipos con el sistema de paquetes, pero también utiliza su propia infraestructura para tareas más específicas de despliegues masivos (como inicialización, particionado, configuración, etc).
Cada una de estas herramientas tiene sus ventajas y desventajas: SystemImager funciona independientemente de cualquier sistema de paquetes particular, lo que permite gestionar grandes conjuntos de máquinas que utilizan diferentes distribuciones Linux. También incluye un sistema de actualización que no necesita una reinstalación, pero sólo puede confiar en este sistema de actualización si no se modifican las máquinas de forma independiente; en otras palabras, el usuario no debe actualizar ningún software por su cuenta ni instalar otro software. De forma similar, no se debe automatizar las actualizaciones de seguridad porque éstos deben pasar por la imagen de referencia centralizada que administra SystemImager. Esta solución también requiere que las máquinas objetivo sean homogéneas, de lo contrario necesitará mantener y administrar diferentes imágenes (no podrá utilizar una imagen i386 en una máquina powerpc, etc.).
Por el otro lado, puede adaptar la instalación automatizada con debian-installer a cada máquina específica: el instalador obtendrá el núcleo y los paquetes de software apropiados de los repositorios relevantes, detectará el hardware disponible, particionará el disco duro completo para aprovechar todo el espacio disponible, instalará el sistema Debian correspondiente y configurará el gestor de arranque adecuado. Sin embargo, el instalador estándar sólo instalará versiones de Debian estándar, con el sistema base y un subconjunto de «tareas» preseleccionadas; esto no permite instalar un sistema particular con aplicaciones no empaquetadas. Satisfacer esta necesidad particular requerirá modificar el instalador… afortunadamente el instalador es muy modular y existen herramientas para automatizar la mayor parte del trabajo necesario para esta personalización, la más importante siendo simple-CDD (CDD es acrónimo de derivado personalizado de Debian: «Custom Debian Derivative»). Inclusive la solución simple-CDD, sin embargo, sólo gestiona la instalación inicial; lo que no es un problema generalmente ya que las herramientas de APT permite desplegar actualizaciones de forma eficiente más adelante.
Sólo haremos una revisión general de FAI y saltearemos SystemImager por completo (ya no se encuentra en Debian), para poder enfocarnos más intensamente en debian-installer y simple-CDD, que son más interesantes en un contexto sólo con Debian.

12.3.1. Instalador completamente automático (FAI: «Fully Automatic Installer»)

Fully Automatic Installer es probablemente el sistema de despliegue automático para Debian más antiguo, lo que explica su estado como referencia; pero su naturaleza flexible compensa su complejidad.
FAI necesita un sistema servidor para almacenar la información de despliegue y permitir que las máquinas objetivo arranquen desde la red. Este servidor necesita el paquete fai-server (o fai-quickstart, que también incluye los elementos necesarios para una configuración estándar).
FAI utiliza un enfoque específico para definir los varios perfiles instalables. En lugar de simplemente duplicar una instalación de referencia, FAI es un instalador completo, totalmente configurable a través de archivos y scripts almacenados en el servidor; no se crea automáticamente la ubicación predeterminada /srv/fai/config/, por lo que el administrador debe crearla junto con los archivos relevantes. La mayoría de las veces, estos archivos serán personalizados de archivos de ejemplos disponibles en la documentación del paquete fai-doc, en el directorio /usr/share/doc/fai-doc/examples/simple/ en particular.
Una vez que definimos los perfiles, el programa fai-setup genera los elementos necesarios para iniciar una instalación FAI; esto significa en su mayor parte preparar o actualizar un sistema mínimo (raíz NFS) para utilizar durante la instalación. Una alternativa es generar un CD de arranque dedicado con fai-cd.
Crear todos estos archivos de configuración requiere entender cómo funciona FAI. Un proceso de instalación típico consiste de los siguientes pasos:
  • obtener un núcleo de la red e iniciarlo;
  • montar el sistema de archivos raíz desde NFS;
  • ejecutar /usr/sbin/fai que controla el resto del proceso (los pasos siguientes, por lo tanto, son iniciados por este script);
  • copiar el espacio de configuración desde el servidor a /fai/;
  • ejecutar fai-class. Se ejecutan en orden los scripts /fai/class/[0-9][0-9]* y devuelve los nombres de «clases» que aplican a la máquina siendo instalada; esta información servirá como base para los pasos siguientes. Esto permite cierta flexibilidad en la definición de los servicios a instalar y configurar.
  • obtener una cantidad de variables de configuración, que dependen de las clases relevantes;
  • particionar los discos y dar formato a las particiones basándose en la información provista por /fai/disk_config/clase;
  • montar dichas particiones;
  • instalar el sistema base;
  • presembrar la base de datos Debconf con fai-debconf;
  • obtener la lista de paquetes disponibles para APT;
  • instalar los paquetes enumerados en /fai/package_config/clase;
  • ejecutar los scripts postconfiguración, /fai/scripts/clase/[0-9][0-9]*;
  • grabar los registros de instalación, desmontar las particiones y reiniciar.

12.3.2. Presembrado de Debian-Installer

Después de todo, la mejor herramienta para instalar sistemas Debian lógicamente debería ser el instalador oficial de Debian. Es por esto que, desde su concepción, se diseñó debian-installer para usarlo de forma automatizada aprovechando la infraestructura que provee debconf. Este último permite, por un lado, reducir la cantidad de preguntas realizadas (las preguntas escondidas utilizarán la respuesta predeterminada provista) y por el otro proveer respuestas predeterminadas por separado para que la instalación pueda no ser interactiva. Se conoce a esta última funcionalidad como presembrado («preseeding»).

12.3.2.1. Utilización de un archivo de presembrado

Hay varios lugares de los que el instalador puede obtener un archivo de presembrado:
  • en el initrd que arranca la máquina; en este caso, el presembrado ocurre muy al comienzo de la instalación y puede evitar todas las preguntas. Sólo debe asegurarse que el archivo tenga el nombre preseed.cfg y esté almacenado en la raíz del initrd.
  • en el medio de arranque (CD o llave USB); el presembrado ocurre tan pronto como se monte el medio, lo que significa inmediatamente después de las preguntas sobre idioma y distribución de teclado. Puede utilizar el parámetro de arranque preseed/file para indicar la ubicación del archivo de presembrado (por ejemplo, /cdrom/preseed.cfg cuando se realiza la instalación desde un CD-ROM o /hd-media/preseed.cfg en el caso de una llave USB).
  • desde la red; el presembrado ocurrirá entonces sólo después que se configure (automáticamente) la red; el parámetro de arranque relevante es preseed/url=http://servidor/preseed.cfg.
A primera vista, incluir el archivo de presembrado en el initrd parecería la solución más interesante; sin embargo, rara vez se la utiliza en la práctica porque generar un initrd de instalación es bastante complejo. Las otras dos soluciones son mucho más comunes, especialmente debido a que los parámetros de arranque proveen otra forma de presembrar las respuestas a las primeras preguntas del proceso de instalación. La forma usual de evitar la molestia de tipear estos parámetros a mano en cada instalación es guardarlos en la configuración de isolinux (en el caso del CD-ROM) o syslinux (para la llave USB).

12.3.2.2. Creación de un archivo de presembrado

Un archivo de presembrado es un archivo en texto plano en el que cada línea contiene la respuesta a una pregunta Debconf. Cada línea está dividida en cuatro campos separados por espacios en blancos (espacios o tabulaciones) como, por ejemplo, d-i mirror/suite string stable:
  • el primer campo es el «dueño» de la pregunta; utilizamos «d-i» para las preguntas relevantes al instalador, pero también puede ser el nombre de un paquete para las preguntas que provengan de un paquete Debian;
  • el segundo campo es un identificador para la pregunta;
  • tercero, el tipo de pregunta;
  • el cuarto y último campo contiene el valor de la respuesta. Tenga en cuenta que debe estar separado del tercer campo sólo por un espacio; si hay más de uno, el siguiente carácter de espacio es considerado parte del valor.
La forma más simple de escribir un archivo de presembrado es instalar un sistema a mano. Luego, debconf-get-selections --installer proveerá las respuestas que involucran al instalador. Puede obtener las respuestas sobre otros paquetes con debconf-get-selections. Sin embargo, una solución más limpia es escribir el archivo de presembrado a mano, comenzando con un ejemplo y la documentación de referencia: con este enfoque, sólo necesitará presembrar las preguntas en las que desea modificar la respuesta predeterminada; utilizar el parámetro de arranque priority=critical le indicará a Debconf que sólo realice las preguntas críticas y que utilice las respuestas predeterminadas para las demás.

12.3.2.3. Creación de un medio de arranque personalizado

Saber dónde almacenar el archivo de presembrado está bien, pero la ubicación no lo es todo: uno debe, de una u otra forma, alterar el medio de arranque de la instalación para modificar los parámetros de arranque y agregar el archivo de presembrado.
12.3.2.3.1. Arranque desde la red
Cuando un equipo arranca desde la red, el servidor que envía los elementos de inicialización también define los parámetros de arranque. Por lo tanto, debe modificar la configuración de PXE en el servidor de arranque; más específicamente, en su archivo de configuración /tftpboot/pxelinux.cfg/default. Definir el arranque por red es un prerequisito; revise la guía de instalación para más detalles.
12.3.2.3.2. Preparación de una llave USB de arranque
Una vez que preparó una llave de arranque (revise la Sección 4.1.2, “Arranque desde una llave USB”), necesitará unas pocas operaciones adicionales. Asumiendo que el contenido de la llave se encuentra en /media/usbdisk/:
  • copie el archivo de presembrado a /media/usbdisk/preseed.cfg
  • edite /media/usbdisk/syslinux.cfg y agrege los parámetros de arranque necesarios (revise el ejemplo a continuación).

Ejemplo 12.2. Archivo syslinux.cfg y parámetros de presembrado

default vmlinuz
append preseed/file=/hd-media/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 initrd=initrd.gz  --
12.3.2.3.3. Creación de una imagen de CD-ROM
Una llave USB es un medio de lectura y escritura, por lo que es sencillo agregar un archivo allí y cambiar unos pocos parámetros. En el caso de un CD-ROM, la operación es más compleja ya que necesitamos generar una imagen ISO completa. debian-cd se encarga de esto, pero es bastante extraño utilizar esta herramienta: necesita un repositorio local y requiere entender todas las opciones que provee /usr/share/debian-cd/CONF.sh; aún entonces, debe ejecutar make varias veces. Se recomienda leer /usr/share/debian-cd/README.
Habiendo dicho esto, debian-cd siempre funciona de forma similar: genera un directorio «image» con el contenido exacto del CD-ROM y luego lo convierte en un archivo ISO con una herramienta como genisoimage, mkisofs o xorriso. El directorio de imagen es completado luego del paso make image-trees de debian-cd. En este punto, agregaremos el archivo de presembrado en el directorio apropiado (usualmente $TDIR/$CODENAME/CD1/, donde $TDIR y $CODENAME son parámetros definidos por el archivo de configuración CONF.sh). El CD-ROM utiliza isolinux como gestor de arranque, y debemos adaptar el archivo de configuración que generó debian-cd para poder agregar los parámetros de arranque necesarios (el archivo específico es $TDIR/$CODENAME/boot1/isolinux/isolinux.cfg). Luego puede continuar el proceso «normal» y generar la imagen ISO con make image CD=1 (o make images si está generando varios CD-ROMs).

12.3.3. Simple-CDD: la solución todo-en-uno

Utilizar sólamente un archivo de presembrado no es suficiente para satisfacer todos los requisitos que podrían aparecer en despliegues grandes. Aunque es posible ejecutar algunos scripts al final del proceso normal de instalación, todavía no es muy flexible la selección del conjunto de paquetes a instalar (básicamente, sólo puede seleccionar «tareas»); lo que es más importante, esto sólo permite instalar paquetes Debian oficiales y excluye aquellos generados localmente.
Por el otro lado, debian-cd puede integrar paquetes externos y se puede extender debian-installer agregando nuevos pasos en el proceso de instalación. Combinando estas capacidades, debería ser posible crear un instalador completamente personalizado que satisfaga nuestras necesidades; inclusive debería poder configurar algunos servicios luego de desempaquetar los paquetes necesarios. Afortunadamente, esto no es sólo una hipótesis ya que esto es exactamente lo que hace Simple-CDD (en el paquete simple-cdd).
El propósito de Simple-CDD es permitir que cualquiera pueda crear fácilmente una distribución derivada de Debian seleccionando un subconjunto de los paquetes disponibles, preconfigurarlos con Debconf, agregar software específico y ejecutar scripts personalizados al final del proceso de instalación. Esto coincide con la filosofía de «sistema operativo universal» ya que cualquiera puede adaptarlo a sus necesidades.

12.3.3.1. Creación de perfiles

Simple-CDD define «perfiles» que coinciden con el concepto de «clases» de FAI; una máquina puede tener varios perfiles (determinados en el momento de la instalación). Se define un perfil con un conjunto de archivos profiles/perfil.*:
  • el archivo .description contiene una descripción de una línea sobre el perfil;
  • el archivo .packages enumera los paquetes que se instalarán automáticamente si se selecciona el perfil;
  • el archivo .downloads enumera los paquetes que se almacenarán en el medio de instalación pero no se instalarán obligatoriamente;
  • el archivo .preseed contiene información de presembrado para las preguntas de Debconf (para el instalador y/o los paquetes);
  • el archivo .postinst contiene un script que se ejecutará al final del proceso de instalación;
  • finalmente, el archivo .conf permite modificar algunos parámetros de Simple-CDD basado en los perfiles incluidos en la imagen.
El perfil default («predeterminado») tiene un rol particular ya que siempre está activo; contiene lo mínimo necesario para que funcione Simple-CDD. Lo único que generalmente personalizaremos en este perfile es el parámetro de presembrado simple-cdd/profiles: esto permite esquivar la pregunta sobre los perfiles a instalar que agrega Simple-CDD.
Sepa también que necesitará ejecutar todo desde el directorio que contenga el directorio profiles.

12.3.3.2. Configuración y uso de build-simple-cdd

Simple-CDD necesita muchos parámetros para todo su funcionamiento. En la mayoría de los casos los obtendrá de un archivo de configuración al que podemos apuntar con la opción --conf de build-simple-cdd, pero también podemos especificarlos como parámetros específicos al ejecutar build-simple-cdd. Aquí hay una vista rápida sobre cómo funciona este programa y cómo utilizar sus parámetros:
  • el parámetro profiles enumera los perfiles que se incluirán en la imagen de CD-ROM generada;
  • basado en la lista de paquetes necesarios, Simple-CDD descarga los archivos necesarios desde el servidor mencionado en server y los reúne en un repositorio parcial (que luego le proveerá a debian-cd);
  • también se integrarán a este repositorio local los paquetes personalizados mencionados en local_packages;
  • luego ejecutará debian-cd (con una ubicación predeterminada que puede configurar con la variable debian_cd_dir) con la lista de paquetes a integrar;
  • una vez que debian-cd preparó este directorio, Simple-CDD realiza algunos cambios al mismo:
    • agrega los archivos que contienen los perfiles en un subdirectorio simple-cdd (que serán incluidos en el CD-ROM);
    • también se agregarán los demás archivos enumerados en el parámetro all_extras;
    • ajustará los parámetros de arranque para permitir presembrado. Puede evitar las preguntas sobre idioma y país si almacena la información necesaria en las variables language y country.
  • luego debian-cd genera la imagen ISO final.

12.3.3.3. Generación de una imagen ISO

Una vez que escribimos un archivo de configuración y definimos nuestros perfiles, el paso restante es ejecutar build-simple-cdd --conf simple-cdd.conf. Luego de unos minutos tendremos la imagen necesaria en images/debian-10-amd64-CD-1.iso.