marzo 2016

You are currently browsing the monthly archive for marzo 2016.

Hace poco me he encontrado en la necesidad de mandar automáticamente una tarea de fondo en un servidor remoto. Se trata de lanzar un script de bash y que se ejecute permanentemente dentro de su propio terminal aislado.

La automatización la hago con Ansible. Ansible es una herramienta (libre; GPLv3) de gestión de configuraciones pero también de orquestación y de despliegue. Permite la creación de recetas que hacen los despliegues complejos reproducibles. Pero lo mejor es que escala muy bien hacia abajo (y hacia arriba) y permite hacer fácilmente tareas sencillas.

Los comandos byobu, tmux o screen permiten la ejecutar tareas de fondo en un terminal que se mantiene abierto aunque se cambie de estación de trabajo. Se puede enviar un comando dentro de un terminal de estos programas, desconectarse del terminal, cambiar de equipo y volver a conectarse a ese terminal. Mientras tanto, el comando se sigue ejecutando sin problemas. En nuestro caso vamos a mandar un comando con Ansible a un ordenador remoto para que se quede ejecutándose de fondo y poder recuperar un terminal en un momento posterior.

Con Ansible se puede crear una tarea como esta:

tasks:
 - name: launch profile process
   command: "screen -dmS profile bash -c 'cd /mnt/data/log; python /home/ubuntu/scripts/profile_node.py'; sleep 1"
   async: 45
   poll: 0

Estas líneas hacen lo siguiente:

  • Usamos el módulo command para lanzar el comando.
  • Con el screen -dmS profile le decimos a screen que mande la tarea en una sesión cuyo sufijo sea «profile» y que no se conecte a ella sino que la deje de fondo.
  • Dentro de screen lanzamos bash y le decimos que ejecute el comando que hay entre comillas simples.
  • El comando cambia de directorio y ejecuta el script «/home/ubuntu/scripts/profile_node.py».
  • Al final del comando ponemos un «sleep 1» ya que, aparentemente, Ansible y fabric requieren ese truco para que no haya problemas al lanzar una sesión de screen.
  • Por último usamos «async: 45» para que Ansible mande la tarea de forma asíncrona y «poll: 0» para que no intente comprobar su estado nunca. El resultado final es que la tarea se manda y Ansible se despreocupa de ella.

El comando se queda ejecutándose dentro de una sesión de screen. Más tarde podemos hacer login en el ordenador remoto y conectarnos a la sesión de screen para ver el estado en que se encuentra la ejecución del comando:

  • Con «screen -ls» se obtiene una lista de las sesiones de screen disponibles.
  • Si hay varias sesiones, nos interesa la sesión cuyo nombre acabe en «profile», por ejemplo «1234.profile».
  • Para conectarse a esa sesión se usa «screen -r 1234.profile».

Como comentario adicional, la conexión a screen se puede realizar desde dentro de un panel de byobu o tmux. Si las combinaciones de teclas de control son las mismas que las de screen, no es posible controlar la sesión desde dentro de estos entornos. Esto no sería un problema si solo se quiere comprobar el estado de ejecución del programa. Al cerrar el panel de tmux o byobu la sesión de screen sigue ejecutándose en su entorno sin problema.

Tags: , ,