En el día a día de un SysAdmin hay cientos de tareas repetitivas que resultan ultra aburridas. Es allí donde viene Ansible al rescate. Gracias a Ansible es posible automatizar todas esas tareas triviales y aburridas para no tener que hacerlas nunca más. En lugar de seguir un tutorial con varios pasos entre diferentes sistemas (tedioso y propenso a errores), ejecutar un simple comando, 1 sólo, y dejar que Ansible lo haga por nosotros. Todo se resume a "scriptear" la tarea, convertirla en una descripción de pasos en formato YML que Ansible sea capaz de realizar.

Este es uno de esos ejemplos. Muchas veces es necesario compartir logs u otro tipo de información con gente por fuera del departamento de IT, pero que es responsable o representante de cierto sistema para los usuarios, clientes o proveedores. Este tipo de información no es conveniente compartirla por correo electrónico u otros medios, con lo cual preferimos subirla a uno de nuestros servidores Web en un directorio secreto protegido con contraseña. Desde allí la persona que requiere tal información puede descargarla y hacer con ella lo que necesite. En mi caso, suelen solicitarme con frecuencia los logs de un servidor Glassfish para enviarlos al proveedor del software (a fin de diagnosticar alguno de los miles de errores que tiene).

El día de hoy me harté. Cuando cierta tarea se vuelve repetitiva, es decir su frecuencia aumenta hasta cierto período, llega el momento de automatizarla. En el pasado utilizaba scripts Bash a tal fin, pero hoy en día es mucho más fácil y rápido crear un simple playbook de Ansible en formato YML.



La forma más simple de mover archivos entre servidores con Ansible consiste en: 1- descargar el archivo desde el servidor origen al master (sistema o servidor donde ejecutamos Ansible); 2- subir el archivo al servidor destino.

A tal fin se recurre a los módulos fetch para descargar el archivo y copy para subir el archivo.

De yapa, con el módulo archive es posible compactar el archivo en el destino en formato ZIP o GZIP para ahorrar espacio y ancho de banda (cuando sea descargado luego).

El siguiente playbook descargar el archivo /opt/glassfish/domains/linuxito/logs/server.log desde el servidor "app-glass.linuxito.com" y lo sube al servidor "app.linuxito.com" dentro del directorio /var/www/top-secret/. Luego crea un archivo TAR comprimido en formato GZIP y borra el original.

---
# Este playbook publica una copia fresca de los logs de Glassfish de App (producción)

- hosts: app-glass.linuxito.com
  become: yes
  tasks:
    - name: Descargar el log de Glassfish
      fetch:
        src: /opt/glassfish/domains/linuxito/logs/server.log
        dest: /tmp/

- hosts: app.linuxito.com
  become: yes
  tasks:
    - name: Subir el log a app.linuxito.com
      copy:
        src: /tmp/app-glass.linuxito.com/opt/glassfish/domains/linuxito/logs/server.log
        dest: /var/www/top-secret/
        owner: root
        group: root
        mode: '0644'
    - name: Compactar el archivo
      archive:
        path:
          - /var/www/top-secret/server.log
        dest: /var/www/top-secret/server.log.tar.gz
        format: gz
    - name: Eliminar el archivo plano
      file:
        path: /var/www/top-secret/server.log
        state: absent

El módulo fetch simplemente requiere la ruta origen (en el servidor remoto) y la ruta destino (en el sistema actual, o master de Ansible). Se debe tener en cuenta que dentro del directorio destino, el módulo creará un subdirectorio con el nombre de host, y allí replicará la ruta completa. Esta ruta (en el sistema local) es la que se debe usar en el módulo copy para subir el archivo al destino.

El módulo copy es similar a fetch, salvo que además se pueden definir parámetros adicionales como el ownership y modo (permisos).

La última tarea es un extra y consiste en crear un .tar.gz a partir del archivo de log. El módulo archive permite crear todo tipo de archivos comprimidos. Simplemente se deben especificar uno o varios archivos a compactar, y la ruta al archivo de salida junto con el formato. Finalmente se borra el archivo origen con el módulo file indicando el estado "absent".

Para más información y otras opciones, revisar la documentación de cada uno de los módulos de Ansible anteriormente mencionados.

Referencias


Tal vez pueda interesarte


Compartí este artículo