Creación de un sistema automatizado de instalación

Introducción

Creación de un sistema automatizado de instalación. Se deberá configurar el sistema para que se responda automáticamente a todos los item en la instalación. Las diferentes contraseñas deberán codificarse para que no aparezcan en texto plano. Se trabajará con un esquema lvm creando volúmenes lógicos /, home y var.

  1. Instalación basada en fichero de configuración preseed.
    • Instalación automatizada basada en medio de almacenamiento extraíble.
    • Instalación automatizada con carga de preseed desde red.
  2. Instalación basada en preseed/PXE/TFTP.

Manos a la obra

Para realizar esta práctica, el primer paso que debemos hacer será descargarnos la imagen ISO con la que vamos a trabajar. La que yo he utilizado la podemos encontrar en este enlace

1

Una vez que nos hemos descargado la imagen iso, lo montamos en un directorio para poder realizar los cambios convenientes y lo haremos de la siguiente manera:

mkdir /mnt/iso
mount -o loop "nombre-iso" 

Para montar la iso desatendida, no vamos a necesitar todos los ficheros, sino que vamos a copiar los necesarios y crearemos un enlace simbólico que apuntará al resto.

mkdir iso-preseed && cd iso-preseed
cp -pr /mnt/iso/install.amd install.amd
cp -pr /mnt/iso/dists dists
cp -pr /mnt/iso/pool pool
cp -pr /mnt/iso/.disk .disk
cp -pr /mnt/iso/isolinux isolinux
ln -s .debian

Dentro de este directorio, creamos el directorio donde vamos a alojar nuesstro archivo preseed.cfg. En mi caso, tiene la siguiente estructura:

##############################################################################

#

#   Instalación automatizada de Debian

#

##############################################################################


#Configuración de lenguaje

d-i debian-installer/locale string es_ES
d-i debian-installer/language string spanish
d-i debian-installer/country string Spain
d-i debian-installer/locale string es_ES.UTF-8
d-i localechooser/supported-locales es_ES.UTF-8

#Configuración de teclado

d-i keyboard-configuration/toggle select No toggling
d-i keymap select es
d-i console-setup/ask_detect boolean true
d-i keyboard-configuration/modelcode string pc105
d-i keyboard-configuration/layoutcode string es
d-i keyboard-configuration/variantcode string qwerty

#Configuración de interfaz

d-i netcfg/choose_interface select auto

#Creación del usuario y superusuario

d-i passwd/root-password password admin
d-i passwd/root-password-again password admin
d-i passwd/user-fullname string debian
d-i passwd/username string debian
d-i passwd/user-password password admin
d-i passwd/user-password-again password admin

#Configuración del nombre del host y selección de dominio

d-i netcfg/get_hostname string debian
d-i netcfg/get_domain string
d-i hw-detect/load_firmware boolean false

#Seleccionamos zona horaria (España en nuestro caso)

d-i clock-setup/utc boolean true
d-i time/zone string ES/Madrid
d-i clock-setup/ntp boolean true

#Configuramos el repositorio Debian

d-i mirror/country string manual
d-i mirror/http/hostname string ftp.es.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

#Configuración de la negativa a la participación en la encuesta

popularity-contest popularity-contest/participate boolean false

#Configuración de particiones

#Vamos a realizar un LVM creando volúmenes lógicos /, home y var.

d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string lvm
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/device_remove_lvm_span boolean true
d-i partman-auto/purge_lvm_from_device boolean true
d-i partman-auto-lvm/new_vg_name string vg00
d-i partman-auto-lvm/guided_size string max
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/choose_recipe select maria_lvm
d-i partman-auto/expert_recipe string                         \

       maria_lvm ::                                           \

              2048 1 2048 ext4                                \

                      $primary{ } $bootable{ }                \

                      method{ format } format{ }              \

                      use_filesystem{ } filesystem{ ext4 }    \

                      label{ boot }                           \

                      mountpoint{ /boot }                     \

              .                                               \

              16384 16384 16384 ext4                          \

                    $primary{ }                               \

                    method{ lvm }                             \

                    device{ /dev/sda }                        \

                    vg_name{ vg00 }                           \

              .                                               \

              6656 6656 6656 ext4                             \

                     $lvmok{ } in_vg{ vg00 }                  \

                     lv_name{ lv_root }                       \

                     method{ format } format{ }               \

                     use_filesystem{ } filesystem{ ext4 }     \

                     label { root }                           \

                     mountpoint{ / }                          \

              .                                               \

              2048 2048 2048 ext4                             \

                     $lvmok{ } in_vg{ vg00 }                  \

                     lv_name{ var }                           \

                     method{ format } format{ }               \

                     use_filesystem{ } filesystem{ ext4  }    \

                     label { var }                            \

                     mountpoint{ /var }                       \

              .                                               \

              6656 6656 6656 ext4                             \

                     $lvmok{ } in_vg{ vg00 }                  \

                     lv_name{ lv_home }                       \

                     method{ format } format{ }               \

                     use_filesystem{ } filesystem{ ext4 }     \

                     label { home }                           \

                     mountpoint{ /home }                      \

              .

#Finalización de la partición

d-i partman-basicfilesystems/no_swap boolean false
d-i partman-lvm/confirm boolean true
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select Finish partitioning and write changes to disk
d-i partman/confirm boolean true
d-i mdadm/boot_degraded boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/confirm_nooverwrite boolean true

#Análisis de medios adicionales

d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false
d-i apt-setup/cdrom/set-failed boolean false

#Instalación del grub

d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean false
d-i grub-installer/bootdev string default

#Selección de paquetes

tasksel tasksel/first multiselect standard, ssh-server

#Finalización de la instalación

d-i finish-install/reboot_in_progress note

El siguiente paso que realizaremos será el de editar el archivo txt.cfg ubicado dentro del directorio /isolinux de la siguiente forma:

default install
label install
        menu label ^Install
        kernel /install.amd/vmlinuz
        append vga=788 initrd=/install.amd/initrd.gz -- quiet
label unattended-gnome
 menu label ^Instalacion desatendida Debian 11
 kernel /install.amd/gtk/vmlinuz
 append vga=788 initrd=/install.amd/gtk/initrd.gz preseed/file=/cdrom/respuestas/preseed.cfg locale=es_ES console-setup/ask_detect=false keyboard-configuration/xkb-keymap=es --

Al realizar cambios en el directorio /isolinux, generaremos la suma de verificación que irá alojada en el CD:

md5sum `find ! -name "md5sum.txt" ! -path "./isolinux/*" -follow -type f` > md5sum.txt

Por último, solo nos quedaría generar la imagen iso:

genisoimage -o cd-preseed.iso -l -r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat iso-preseed

2

Creamos una máquina virtual y compromabos que nuestra instalación se desarrolla correctamente:

3

Una vez realizada la instalación, ejecutamos el comando lsblk para ver si realmente, se ha realizado el LVM como deseábamos.

4

Errores encontrados hasta este punto de proceso:

  • Al realizar las pruebas en KVM, al no borrarse por completo la configuración de la máquina, dado que el archivo qcow2 de dicha máquina seguía guardado, al realizar una nueva prueba, no se reflejaban los nuevos cambios al reutilizarse continuamente el mismo archivo.

Instalación automatizada con carga de preseed desde red

Creamos una máquina virtual con vagrant en la que configuraremos un servidor nginx y añadiremos nuestra iso (que está en nuestra máquina) a nuestro servidor.

Vagrant.configure("2") do |config|
  config.vm.box = "debian/bullseye64" 
  config.vm.hostname = "servidorDHCP" 
  config.vm.network :private_network,  
    :libvirt__network_name => "red-server", 
    :libvirt__dhcp_enabled => false, 
    :ip => "172.22.2.5",
    :libvirt__forward_mode => "none" 

Configuramos en esta máquina un servidor nginx donde alojaremos el fichero de configuración preseed.cfg

5

6

El fichero de configuración está alojado en mi máquina física, por lo que vamos a necesitar traspasar una copia de dicho fichero a la máquina servidor:

scp /home/maria/preseed.cfg vagrant@192.168.121.175:/home/vagrant/

7

Copiamos el fichero .cfg al directorio donde se aloja el servidor web.

sudo cp preseed.cfg /var/www/html/

Nos dirigimos al navegador para cerciorarnos de que efectivamente, podemos acceder al fichero preseed.cfg

http://192.168.121.175/preseed.cfg

Hacemos una máquina virtual en la que vamos a aplicar esta configuración a través del método de carga desde red. Esta máquina tendrá una imagen iso sin tocar, sin modificar. Y en el menú de arranque de la instalación elegimos las siguientes opciones:

8

9

La instalación comienza, y cuando lleguemos a esta ventana de configuración, escribimos la dirección web donde está alojado nuestro preseed.cfg

10

Cargado el archivo de configuración y realizada la instalación, apagamos la máquina, cambiamos las opciones de arranque y omitimos el arranque dela iso y ponemos en marcha de nuevo nuestra máquina. Ponemos las credenciales y realizamos el siguiente comando para ver, que efectivamente, nuestra máquina tiene la configuración de particiones, usuario, idioma,… correctamente realizada.

lbksl

11

Instalación basada en preseed/PXE/TFTP

Instalamos DHCP

Para realizar la instalación en PXE/TFTP realizaremos los siguientes pasos en una máquina debian que usaremos como servidor dhcp.

sudo apt install isc-dhcp-server

y lo configuramos de la siguiente manera, modificando los ficheros alojados en /etc/dhcp/dhcpd.conf y el /etc/default/isc-dhcp-server:

dhcpd.conf
------
allow booting;

subnet 192.168.121.0 netmask 255.255.255.0 {
  range 192.168.121.20 192.168.121.50;
  option broadcast-address 192.168.121.255;
  option routers 192.168.121.1;
  option domain-name-servers 192.168.121.1;
  next-server 192.168.121.10;
  filename "pxelinux.0";
}

Tras estas modificaciones, reiniciamos el servicio con el siguiente comando:

sudo systemctl restart isc-dhcp-server

Instalamos TFTP

Procedemos a la instalación del servidor TFTP:

sudo apt install tftpd-hpa

Seguido de esto, creamos el directorio en el que descargaremos la imagen iso que luego descomprimiremos en el mismo:

mkdir /srv/tftp #Creamos directorio

cd /srv/tftp #Nos movemos al directorio

wget https://deb.debian.org/debian/dists/bullseye/main/installer-amd64/current/images/netboot/netboot.tar.gz #Nos descargamos la ISO

sudo tar -xvf netboot.tar.gz #Descomprimimos la ISO

Hecho todo lo anterior, nos disponemos a realizar un reinicio del tftp y comenzaríamos con la configuración de la máquina virtual:

sudo systemctl restart tftpd-hpa

Escenario

Abrimos KVM y realizamos las siguientes configuraciones: *Realizamos todas las configuraciones que aparecen en las imágenes.

12

13

14

15

16

ERRORES:

He tenido muchos errores a la hora de configurar el servidor DHCP debido a un conflicto que se causó en mi máquina, que finalmente resolví y pude configurar tanto el servicio TFTP y el DHCP.

17

A la hora de arrancar esta última máquina en la que se realizaría la instalación a través del PXE, me salta un error de conexión, aún teniendo las máquinas en la misma red conectadas.

18