Ansible (II): nuestro primer playbook

Generalmente cualquier sysadmin termina acumulando una serie de scripts que le facilitan la vida. En casa tengo una pequeña motherboard, una prima lejana de la Raspberri Pi que incluía un puerto SATA2 y un Gigabit Ethernet. Así que lo convertí en un pequeño NAS que utilizo de “nube” privada.

Aunque existían opciones más simples, terminé instalándole Nextcloud, un fork de Owncloud y lo utilizo para sincronizar ficheros con mis PCs.

Para que el coste en tiempo del mantenimiento fuera mínimo, terminé desarrollando tres scripts que lo hacían “todo” por mi:

  • Un script que realiza los backups de la máquina.

  • Un script que actualiza el software de la máquina de manera automática y segura.

  • Un script que se encarga de subir el fichero resultante del backup a un Google Drive.

En este post y en el siguiente, voy a explicar el paso a paso de cómo he transformado el primer script en un rol de Ansible que pueda ser utilizado por otros fácilmente.

Primeros pasos

En primer lugar voy a explicar el script original. Podeis verlo aquí.

El script realiza un backup completo de todas las partes que necesitaríamos en caso de tener que reconstruir el servidor: directorio web, directorio de datos, bases de datos asociadas, archivos de configuración de los servicios de la máquina, etc. Por simple comodidad, el backup es completo y no incremental. Consta de los siguientes pasos:

  • Generamos un directorio temporal donde almacenamos una copia de todos los archivos del web server, de los datos de los usuarios y realizamos un volcado de las bases de datos del servidor.

  • Copiamos los archivos de configuración de los servicios importantes (PHP, MySQL, Nginx, etc)

  • Generamos un archivo comprimido con la carpeta temporal antes generada

  • Lo ciframos con GPG

El script simplemente funciona, pero no necesitaba hacerlo, puesto que puedo gestionar los pasos que realiza de forma sencilla gracias a backupninja. Es una herramienta que se encuentra en todos los repositorios y que nos permite gestionar paso a paso las copias de manera sencilla.

Creación del rol

Para crear el rol no debemos sólo instalar el paquete sino también conocer un poco la estructura interna de backupninja. Dicha herramienta tiene dos tipos de ficheros de configuración:

  • Una general para el servicio localizada en /etc/backupninja.conf

  • Una carpeta (/etc/backup.d/) donde se almacenan todos los pasos que se van a realizar durante el backup. Cada uno de estos ficheros empiezan por un número y si éste es el 0, significa que están desactivados.

Con esto en mente vamos a comenzar con nuestro rol y utilizamos el comando ansible-galaxy init backupninja para que la propia herramienta nos genere la estructura de ficheros yaml y carpetas que debe tener un rol. Nuestro nuevo rol se parecerá a esto:

[tangelov@portatil backupninja] $ tree 
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

Cada carpeta tiene una función:

  • defaults: Almacena los valores que queramos que ciertas variables tengan por defecto. Por ejemplo, yo lo utilizo para colocar todas las variables personalizables a la hora de ejecutar el rol.

  • files: son ficheros que pueden ser desplegados con este rol. Si queremos copiar un fichero estático, es la forma de la que debemos hacerlo.

  • handlers: son determinadas acciones que se ejecutan únicamente cuando alguna tarea ha provocado un cambio en la configuración.

  • meta: es un directorio para añadir metadatos al rol. También podemos usarlo para indicar las dependencias, licencias y comentarios del rol.

  • tasks: Contiene las diferentes tareas que va a realizar nuestro rol.

  • templates: Contiene plantillas escritas en formato Jinja2 que podremos personalizar con variables de manera dinámica.

  • tests: Se almacenan los tests de infraestructura que prueban nuestro rol en un entorno de laboratorio.

  • vars: Es una carpeta donde podemos almacenar variables (no es el único sitio donde podemos hacerlo)

Ya en el siguiente post sobre el tema, empezaremos a crear nuestro rol.

Documentación

Revisado a 01/05/2023