Gestionando Equipos y Servidores a través de Paquetería

Trucos y Utilidades 9 de ene. de 2024

Automatización

Actualmente todo el mundo conoce Ansible, Puppet, Chef, etc.
Se trata de un grupo de herramientas para automatizar instalaciones, despliegues, y configuraciones en equipos.

Dado que hace tiempo o bien no existían estos programas o no se 'estilaba' su uso, en mi trabajo como Administrador de Sistemas necesitaba de una solución fácil y ordenada para gestionar un gran número de servidores con la menor carga de trabajo.

Os presento una solución fácil, quizás no perfecta, pero que permite realizar un mantenimiento total de todo un grupo de servidores de una forma totalmente automatizada y sin necesidad de aprender múltiples y diferentes sintaxis que puedan cambiar con el tiempo con nuevas versiones.

Respecto al uso de aplicaciones como Ansible, Puppet, Chef, el problema que tienen es la curva de aprendizaje, en la que hay que aprender su sintaxis, a veces compleja. Otras veces simplemente es que dependemos de los cambios de preferencias en la empresa, esto supone el tener que aprender de nuevo otra nueva forma de desplegar y gestionar los equipos.

Con la solución que propongo, tan sólo tienes que conocer un poco la paquetería que usa tu distribución para crear un paquete (.deb ó .rpm) y un poco de scripting para poder gestionar la configuración de los equipos destino.

Si a esta 'solución' le incorporas el uso de las herramientas antes indicadas (Ansible, Puppet, Chef), tu vida de SysAdmin será más tranquila y sencilla y podrás dedicar el tiempo a otras tareas importantes.

Caso práctico y forma de abordarlo

Supongamos que tenemos una granja de varios cientos de servidores o equipos y necesitamos que todos estén configurados de igual forma (paquetería, configuración, etc).‌‌
Además tenemos que poder modificar su comportamiento, instalar o actualizar‌‌ aplicaciones e incluso poder personalizar cada uno de estos equipos.‌‌

Un primer vistazo a los elementos que vamos a necesitar:

  • Repositorio: Servidor 'Maestro' de distribución de la paquetería "mágica"
  • Servidores a automatizar: Grupo de Servidores a administrar.
  • Editor: Para crear scripts y ficheros de configuración de la paquetería, podeis usar vuestro editor favorito (vi, nano, joe, etc).

‌‌Os voy a explicar mi 'idea feliz' que he estado usando durante casi 12 años, en‌‌ más de 250 servidores distribuidos por toda España para que estuviesen‌‌"mágicamente" funcionando.‌‌

Esta solución, ha permitido que un grupo que oscilaba entre 3-4 personas‌‌ pudiesen gestionar una gran cantidad de servidores con un mínimo de trabajo.‌‌
Como dije antes, hace 15 años no existían soluciones de tipo Ansible y mucho‌‌ menos de contenedores o el mundo de la 'nube'...‌‌

Para mí, esta fue la forma más sencilla de gestionar en remoto y de forma‌‌ totalmente automatizada un gran número de servidores simultáneamente.

Paso 1: Configurar el Repositorio Maestro de Distribución

Lo primero que necesitamos es tener nuestro propio servidor Maestro de distribución. Esto se realiza creado nuestro propio repositorio de paquetería.

Lee el artículo en que te explico como configurar correctamente un repositorio para paquetería Debian:

Crear Repositorio Debian
Cómo crear tu repositorio propio para tus aplicaciones Debian con el nuevo formato de certificado OpenGPG Motivos para tener un repositorio propio Si te gusta programar y has desarrollado alguna aplicación para GNU/Linux, quizás quieras compartirla con otras personas, no sólo como código en algún…

En un mismo servidor podemos incluso tener paquetería .deb y .rpm funcionando simultáneamente.‌‌
Para simplificar la solución vamos a suponer que sólo estamos administrando un grupo de servidores que usen paquetería Debian (.deb)

Paso 2: Creación del fichero especial 'autodeb'

En el Servidor Maestro (repositorio), construiremos un fichero 'especial' con el tipo de paquetería que usen los servidores administrados.‌‌

El fichero lo vamos a llamar autodeb, para indicar que se trata de un fichero de‌‌ automatización, aunque se puede usar cualquier nombre.

autodeb.deb‌‌
Este fichero .deb es el que va a realizar toda la magia de mantener siempre actualizados todos los servidores que lo instalen, además de permitir realizar cualquier tarea sobre ellos de una forma totalmente desatendida.

¿Qué es lo que tiene de especial este fichero dentro?‌‌
Pues realmente nada y todo.‌‌

autodeb.deb es un es un fichero "vacio", que no hace nada, pero que tras instalarlo la primera vez, podremos hacer con él todo lo que deseemos en los servidores administrados que lo tengan instalado.

Vamos a crear la versión inicial de este fichero autodeb.deb (version 0.0)

Para simplificar la explicación y construcción del mismo, vamos a realizar las tareas como root y nos evitaremos comandos del estilo a fakeroot.

Pasos para la creación de autodeb.deb

a. Creamos el directorio (AutoDEB) donde guardaremos la configuración de nuestro fichero Debian (autodeb.deb):

mkdir -p /ruta/AutoDEB/DEBIAN

b. Creamos todos los ficheros necesarios para la creación de un fichero .deb:

touch /ruta/AutoDEB/DEBIAN/{control,md5sum,preinst,postinst,postrm}
Nota: En esta primera versión solo vamos a usar el fichero control, podremos borrar los otros ficheros.

c. Editamos el fichero control y ponemos en él siguiente contenido:

package: autodeb
Version: 0.0
Architecture: all
Priority: required
Maintainer: Solo con Linux <luisgulo@soloconlinux.org.es>
Section: admin
Description: autodeb - Gestion auto-magica para servidores
 Gestion de paqueteria, scripts y configuraciones desatendidas
Nota: Las líneas sucesivas que forman parte de ‘Description’ deben de llevar siempre un espacio en blanco o se producirá un error.

d. Creación del paquete Debian:‌‌
Retrocedemos un directorio, y desde fuera del directorio AutoDEB, tan sólo hay que generear el paquete .deb, para ello usaremos el comando:

dpkg-deb -b AutoDEB autodeb.deb

e. Subimos el fichero al Repositorio:‌‌
Publicamos el fichero autodeb.deb en nuestro repositorio, mediante el comando 'reprepro':

reprepro -b /ruta_repositorio includedeb bookworm /ruta/autodeb.deb

Con esto ya tenemos preparado el 'control remoto' para los equipos o servidores a administrar.

Paso 3: Opcional. Pero altamente recomendable.

En el grupo de Servidores 'administrados' deberemos tener al menos uno que nos vaya a servir como entorno de Pruebas (puede ser incluso una máquina‌‌ virtual).

Para estas pruebas podemos crearemos un repositorio diferente y antes de publicar en el repositorio final, publicaremos en este, para realizar todas las pruebas de actualización, instalación y/o configuración del paquete creado.

Paso 4: Preparación de los servidores administrados.

En cuanto instalemos un nuevo equipo ó servidor con el software mínimo deseado, lo primero que haremos será configurar un repositorio extra, que será nuestro repositorio maestro.

Des esta forma podrá usar y descargar la paquetería que le vamos a ofrecer.‌‌

Si un servidor ya está instalado y configurado también podemos realizar la‌‌ misma operativa y quedará bajo el control de nuestro servidor maestro y nuestro fichero.

Paso 5: Configurar un 'cron' para la actualización.

Al menos deberemos hacer que los equipos o servidores se actualicen después de un reinicio.‌‌

Como root ejecutamos el comando crontab para editar el cron:

crontab -e

Con el fichero de configuración en modo edición, incluimos la siguiente línea:

@reboot apt -y update; apt -y upgrade

Además, podemos forzar que cada cierto tiempo se compruebe si hay nuevas actualizaciones. Por ejemplo, a las 8, 17, y 22 horas, para ello podemos incluir la siguiente línea en el cron:

0 8,17,22 * * * apt -y update; apt -y upgrade

Paso 6: Instalar autodeb en la máquina.

El último paso es instalar el fichero autodeb.deb en las máquinas que queramos tener auto-administradas.‌‌

Al realizar este paso, se 'desata la magia' y el servidor pasa a ser gestionado‌‌ auto-mágicamente por el paquete autodeb.‌‌

Si estamos en la versión 0.0 de autodeb, no se instalará ni configurará nada aparentemente, pero por debajo ha quedado todo listo para la gestión de los equipos, como veremos más adelante.

Nada y Todo. El poder de la paquetería

Ya tenemos todo la 'solución' montada. Todos los servidores a administrar estarán configurados para actualizarse contra nuestro repositorio y con el fichero autodeb.deb instalado.

¿Qué puedo hacer ahora con autodeb.deb y como lo hago?

Cada vez que necesitemos que el grupo de servidores que tienen autodeb instalado realicen una tarea en concreto, simplemente necesitamos editar nuestra configuración y crear una nueva versión de autodeb.‌‌

Como hemos definido que se actualicen a un horario deseado, cuando llegue la‌‌ hora de la actualización comprobaran automáticamente la versión de autodeb‌‌, y si es superior a la instalada lo descargarán, instalarán y ejecutarán todas las tareas que incluyamos en nuestro fichero.

Casos sencillos de lo que podemos realizar

Caso 1: Instalación de nuevos paquetes‌‌
Para ello usaremos la opción 'Depends'‌‌.
La 'magia' está en que dentro de autodeb, podemos indicar que la nueva versión tiene dependencias de nuevos paquetes y así forzar a que se instale un programa y todas sus dependencias simplemente modificando nuestro fichero 'especial'.

Ejemplo: Necesitamos instalar MariaDB en todos los servidores (no vamos a‌‌ entrar por ahora en nada de la configuración de MariaDB).‌‌
Simplemente editaremos el fichero 'control', existente dentro de la ruta del paquete y luego generaremos la nueva versión del paquete Debian de autodeb.deb y lo publicaremos en el repositorio.‌‌
Los pasos para realizar esto, serían, cambiarnos a la ruta donde está ubicado el fichero 'control' y editarlo:

cd /ruta/AutoDEB/DEBIAN

Tras la edición el fichero 'control' debería de quedar así:

package: autodeb 
Version: 0.1 
Architecture: all 
Priority: required 
Depends: mariadb-server 
Maintainer: Solo con Linux <luisgulo@soloconlinux.org.es> 
Section: admin 
Description: autodeb - Gestion auto-magica para servidores
 Gestion de paqueteria, scripts y configuraciones desatendidas
 v0.1: MariaDB

Fíjate en lo que hemos cambiado en Version y en Depends.‌‌
Creamos el paquete Debian. Internamente queda fijada la nueva versión 0.1 y la dependencia indicada (MariaDB). Lo publicamos en nuestro repositorio.

Ahora tan solo hay que esperar a que el cron de los equipos administrados realice la actualización de paquetes.‌‌

Detectará un cambio/subida de versión de autodeb de 0.0 a la 0.1  y lo instalará.‌‌
En ese momento detectará que el nuevo paquete tiene una dependencia para su instalación (MariaDB), con lo que resolverá la dependencia instalando automáticamente MariaDB y además las dependencias asociadas.

Caso 2: Ejecución de scripts
‌‌Podemos ejecutar scripts, comandos, cambios de configuración o cualquier otra tarea mediante el uso de los ficheros preinst y postinst.

Tan sólo hay que tener en cuenta que estos scripts no usan /bin/bash, sino que utilizan /bin/sh para su ejecución.

Ejemplo: Hemos detectado que una aplicación de los servidores administrados tiene una dependencia de una librería, pero la intenta localizar en una ruta incorrecta y se puede solucionar mediante la creación de un simple link a esa librería.

La solución es simplemente volver a editar nuestro fichero 'control' y volver a subir en número de versión.‌‌

Aumentar el número de versión, es la parte mas importante de la 'magia', ya que si no aumentamos el número de versión no funcionará.‌‌

Además podemos incluir nuevos comentarios en la parte de 'Description' para dejar constancia de los cambios, aunque lo correcto sería crear un fichero ChangeLog dentro de nuestro fichero autodeb.

La nueva versión del fichero 'control' se vería de la siguiente forma:

package: autodeb 
Version: 0.2 
Architecture: all 
Priority: required 
Depends: mariadb-server 
Maintainer: Solo con Linux <luisgulo@soloconlinux.org.es> 
Section: admin 
Description: autodeb - Gestion auto-magica para servidores 
 Gestion de paqueteria, scripts y configuraciones desatendidas
 v0.1: MariaDB
 v0.2: Ajuste de libreria

Ahora, crearemos el script que ajusta la librería en los servidores:

touch /ruta/AutoDEB/DEBIAN/postinst

Lo editamos y pondremos en él las acciones a realizar. Lo siguiente es un ejemplo ficticio del posible contenido del fichero postinst:

#!/bin/sh -e 
# Ajuste de libreria extra de 64 Bits para la App 'semeolvido'
ln -sf /opt/semeolvido/libcachisnelamar.so /lib/x86_64-linux-gnu/.

Fijamos los permisos del script de post-instalación:

chmod 0555 /ruta/AutoDEB/DEBIAN/postinst

‌Generamos la nueva version de autodeb (versión 0.2) y lo subimos a nuestro repositorio.‌‌
Cuando llegue la tarea de actualización gestionada por el cron, se actualizará la paqueteria, y entre ella nuestro paquete autodeb.deb (pasando de 0.1 a 0.2).
Encontrará el fichero de post-instalación y ejecutará el contenido del script, solventando el problema de la librería.

Nota: En vez de realizar todas las tareas dentro del fichero postinst, podemos crear una estructura de directorios propia en la que iremos poniendo los scripts, ficheros, parches, cambios de configuración, etc. que queramos ejecutar y en fichero postinst simplemente podemos llamarlos para su ejecución en los servidores administrados.

Caso 3: Copia de directorios y ficheros a los servidores administrados.
Puede ser que hayamos creado un software específico o simplemente queremos copiar/instalar en todos y cada unos de los equipos administrados una serie de ficheros en una ruta determinada.

Ejemplo: Hemos creado un software que hemos compilado (supereditor) y queremos copiarlo en los servidores administrados en /opt/SuperEditor

La estructura de ficheros y directorios que deberíamos tener sería la siguiente:

AutoDEB
  |
  +-- DEBIAN (Carpeta necesaria e imprescindible)
  |   |
  |   +-- control
  |   |
  |   +-- md5sum
  |   |
  |   +-- postinst
  |
  +-- opt
      |
      +-- SuperEditor
            |
            +-- supereditor

Todos los directorios que estén directamente dentro de la estructura del fichero Debian se copian tal cual directamente a partir del directorio / del equipo.

En el ejemplo la estructura de directorios /ruta/AutoDEB/opt/SuperEditor, se trasnforma en /opt/SuperEditor en la instalación.
Y el fichero supereditor se copiará/instalará en el servidor que instale el paquete.

Editaremos de nuevo el fichero 'control' y deberá quedar así:

package: autodeb 
Version: 0.3 
Architecture: all 
Priority: required 
Depends: mariadb-server 
Maintainer: Solo con Linux <luisgulo@soloconlinux.org.es> 
Section: admin 
Description: autodeb - Gestion auto-magica para servidores 
 Gestion de paqueteria, scripts y configuraciones desatendidas
 v0.1: MariaDB
 v0.2: Ajuste de libreria
 v0.3: Instalamos supereditor

Creamos la nueva versión del paquete autodeb y lo subimos a nuestro repositorio. En cuanto la tarea del Cron actualice la paquetería tendriamos disponible en todos los servidores administrados nuestra aplicación 'supereditor'


Ficheros dentro del directorio DEBIAN para crear un .deb

  • control: Fichero obligatorio que lleva el número de versión, arquitectura ydependencias de otros paquetes
  • md5sum: MD5 para comprobación directorios y ficheros a instalar
  • preinst, postinst y postrm: Conjunto de scripts (/bin/sh) que se ejecutarán en algún momento de la instalación (antes de la instalación, tras la instalación o en el borrado/desinstalación de la aplicación)

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux