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 pros y contras: 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 en particular requiere personalizar el instalador... Afortunadamente, el instalador es muy modular, y hay herramientas para automatizar la mayor parte del trabajo requerido para esta personalización, lo más importante simple-cdd (CDD es un acrónimo para Debian Derivativo personalizado). Incluso esta solución, sin embargo, sólo maneja instalaciones iniciales; esto generalmente no es un problema ya que las herramientas APT permiten el despliegue eficiente de actualizaciones más adelante.
Sólo haremos una revisión general de FAI y nos saltaremos SystemImager por completo (ya no se encuentra en Debian, pero está disponible como paquete de terceros), 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 diferentes 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/ de acuerdo con /etc/fai/nfsroot.conf, por lo que el administrador debe crearla junto con los archivos relevantes. La mayoría de las veces, estos archivos serán personalizados desde archivos de ejemplo 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 principalmente preparar o actualizar un sistema mínimo (NFS-root) 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 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á sólo después que se configure (automáticamente) la red; el parámetro de arranque relevante es entonces preseed/url=http://servidor/preseed.cfg (HTTPS, FTPS, SFTP, etc. no están soportados).
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 (el nombre de la plantilla);
  • 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.
La preconfiguración de un valor en un fichero de preconfiguración ordena automáticamente al instalador de Debian que no haga esa pregunta. Esto ocurre porque al cargar el fichero de preconfiguración no sólo se establece el(os) valor(es) dados, sino que también se marca cada uno de los diálogos afectados como "vistos" por el usuario. Por lo tanto, es posible preconfigurar el valor de una pregunta y seguir presentando el diálogo al usuario restableciendo el indicador "visto". Tenga en cuenta que el orden en este caso importa y que el valor tiene que ser preconfigurado antes de establecer el diálogo como "no visto" como se muestra en el siguiente ejemplo:
d-i netcfg/hostname string worker
d-i netcfg/hostname seen false

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 se ha preparado una llave de arranque (ver Sección 4.1.2, “Arranque desde una llave USB”), se necesitarán unas pocas operaciones adicionales. Asumiendo que el contenido de la llave se encuentra en /media/usbdisk/, copiar el archivo de preconfiguración en /media/usbdisk/preseed.cfg.
Si ha estado utilizando una imagen ISO híbrida para crear la memoria USB de arranque, entonces tiene que editar /media/usbdisk/boot/grub/grub.cfg (para la pantalla de arranque EFI):

Ejemplo 12.2. archivo boot/grub/grub.cfg y parámetros de preconfiguración

menuentry --hotkey=i 'Install' {
    set background_color=black
    linux    /install.amd/vmlinuz preseed/file=/cdrom/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 --- quiet 
    initrd   /install.amd/initrd.gz
}
Y hay que editar /media/usbdisk/isolinux/isolinux.cfg (para el arranque BIOS) o uno de los archivos que utiliza - por ejemplo /media/usbdisk/isolinux/txt.cfg - para añadir los parámetros de arranque necesarios:

Ejemplo 12.3. Archivo isolinux/txt.cfg y parámetros de preconfiguración

label install
        menu label ^Install
        kernel [...]
        append preseed/file=/cdrom/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 initrd=/install.amd/initrd.gz --- quiet
Si ha estado utilizando la imagen del instalador hd-media para una memoria USB personalizada, edite /media/usbdisk/syslinux.cfg y añada los parámetros de arranque necesarios como se muestra en el siguiente ejemplo:

Ejemplo 12.4. 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.
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 imagen se termina tras el paso make image-trees de debian-cd. En este punto, agregaremos el archivo de presembrado en el directorio apropiado (normalmente $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 se ha de adaptar el archivo de configuración que generó debian-cd para poder agregar los parámetros de arranque necesarios (los archivos específicos son $TDIR/$CODENAME/CD1/isolinux/isolinux.cfg y $TDIR/$CODENAME/CD1/boot/grub/grub.cfg como se puede ver). Luego se puede continuar el proceso «normal» y generar la imagen ISO con make image CD=1 (o make images si se están 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).
El propósito de esta herramienta 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 basados 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 que resta es ejecutar build-simple-cdd --conf simple-cdd.conf. Luego de unos minutos tendremos la imagen necesaria en images/debian-11-amd64-CD-1.iso.