Como vimos en el primer post dedicado a la gestión automatizada de infraestructua IT de la EPS disponemos de una colección de playbooks de Ansible que se encargan, cada uno de ellos, de realizar una serie de tareas concretas (sobre 1, todos o cualquier subconjunto de servidores). La ejecución de estos playbooks se realiza periódicamente para lo cual necesitaremos añadir las tareas al cron del servidor Ansible que gestiona la infraestructura (ver este ejemplo de infraestructura).
En este post vamos explicar cómo realizamos esta tarea con Ansible y que, para nuestro ejemplo, será el playbook cron.
La información de este playbook reside en el fichero cron.yml y permite gestionar la configuración del crontab del servidor Ansible cuyo objetivo es, recordemos, ejecutar diariamente de manera automatizada todos los playbooks del sistema. Los errores de los playbooks así como los cambios producidos por estos, se almacenarán en los ficheros /var/log/ansibleEPS/errors.log y /var/log/ansibleEPS/changes.log respectivamente. Estos ficheros de log se pueden consultar desde el menú /etc/ansibleEPS/menu.py, opción l. Check System Logs (Errors and Changes).
Este playbook utiliza las siguientes variables para ajustar la ejecución de los playbooks al momento que queramos:
- minuteCron -> minuto en el crontab
- hoursCron -> hora en el crontab
- dayCron -> día en el crontab
- weekdayCron -> día de la semana en el crontab
- monthCron -> mes en el crontab
Todas estas variables que controlan el crontab se encuentran definidas en el fichero de variables general /etc/ansibleEPS/group_vars/all/all.
Para ejecutar el playbook y conseguir la programación deseada necesitaremos ejecutar la orden ansible-playbook cron.yml -t start (o la opción stop para detener la programación del cron) o elegir la opción ‘s Stop/Start/Restart System’ del menú.
El playbook cron.yml tiene esta estructura:
# Adding crontab tasks in Ansible Server - hosts: ansible remote_user: "ansible" become: yes become_user: root become_method: sudo tasks: - include: group_by.yml - include: pathFacts.yml - hosts: ansible gather_facts: False remote_user: "ansible" become: yes become_user: root become_method: sudo roles: - cron
Como podemos ver, usará el rol cron, compuesto por 2 tareas que podemos invocar con las etiquetas de control cronStart y cronStop. El código que se ejecuta para añadir las tareas hace uso del módulo cron de Ansible y se puede consultar en cronStart.yml. Para añadir o eliminar la programación de ejecución de playbooks se debe modificar el parámetro JOB del primer módulo cron de este fichero cronStart.yml1. Como se puede observar en el código, existe un segundo módulo cuya función es programar la generación de avisos por correo. Un ejemplo de una línea generada en el fichero del crontab por el primer módulo cron de este rol para un único playbook (common.yml) es:
15 1 * * * cd /etc/ansibleEPS && (ini=$(date); timestamp=$(date +"\%y\%m\%d-\%H\%M"); ansible-playbook /etc/ansibleEPS/common.yml > /var/log/ansibleEPS/.common.$timestamp.log.tmp 2>&1; [ $? -gt 0 ] && ((echo; echo "### ERRORS common.yml - $ini TO $(date) ###"; echo; cat /var/log/ansibleEPS/.common.$timestamp.log.tmp) >> /var/log/ansibleEPS/errors.log); [ `grep "changed="/var/log/ansibleEPS/.common.$timestamp.log.tmp|grep -v "changed=0"|wc -l` -gt 0 ] && ((echo; echo "### CHANGES common.yml - $ini TO $(date) ###"; echo; grep /var/log/ansibleEPS/.common.$timestamp.log.tmp -e "^PLAY " -e "^TASK " -e "changed:" -e "changed="; echo) >> /var/log/ansibleEPS/changes.log); rm -f /var/log/ansibleEPS/.common.$timestamp.log.tmp; echo "### common.yml - $ini TO $(date) ###" >> /var/log/ansibleEPS/summary.log;
El código que se ejecuta para eliminar la programación de las tareas del crontab está en cronStop.yml.
¿Qué conseguiremos con la ejecución de este playbook? Que el crontab del servidor Ansible tenga las órdenes necesarias para ejecutar en los momentos deseados los playbooks de gestión que deseemos que se ejecuten.
¡Esperamos que os sea útil!
1 Una de las mejoras que se puede introducir es que la programación de los playbooks esté almacenada en variable lo que haría más cómodo y elegante su gestión.
One Reply to “Configuración del crontab del servidor Ansible para lanzar todos los playbooks diariamente.”