De forma predeterminada, Ansible ejecuta las tareas de forma sincrónica, manteniendo abierta la conexión con el nodo remoto hasta que se complete la acción. Esto significa que dentro de un libro de jugadas, cada tarea bloquea la siguiente tarea de forma predeterminada, lo que significa que las tareas posteriores no se ejecutarán hasta que se complete la tarea actual. Este comportamiento puede crear desafíos. Por ejemplo, una tarea puede tardar más en completarse de lo que permite la sesión SSH, lo que provoca un tiempo de espera. O puede que desee que se ejecute un proceso de larga duración en segundo plano mientras realiza otras tareas al mismo tiempo. El modo asincrónico le permite controlar cómo se ejecutan las tareas de larga duración.

  • Tareas ad hoc asincrónicas
  • Tareas asincrónicas del libro de jugadas

    • Evite tiempos de espera de conexión: encuesta> 0
    • Ejecutar tareas al mismo tiempo: poll = 0

Tareas ad hoc asincrónicas

Puede ejecutar operaciones de larga duración en segundo plano con tareas ad hoc. Por ejemplo, para ejecutar long_running_operation de forma asincrónica en segundo plano, con un tiempo de espera (-B) de 3600 segundos y sin sondeo (-P):

$ ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"

Para comprobar el estado del trabajo más tarde, utilice el async_status módulo, pasándole el ID de trabajo que se devolvió cuando ejecutó el trabajo original en segundo plano:

$ ansible web1.example.com -m async_status -a "jid=488359678239.2844"

Ansible también puede verificar el estado de su trabajo de larga duración automáticamente con sondeo. En la mayoría de los casos, Ansible mantendrá abierta la conexión a su nodo remoto entre encuestas. Para ejecutar durante 30 minutos y sondear el estado cada 60 segundos:

$ ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff"

El modo de sondeo es inteligente, por lo que todos los trabajos se iniciarán antes de que comience el sondeo en cualquier máquina. Asegúrese de utilizar un --forks valor si desea que todos sus trabajos comiencen muy rápidamente. Después de que se agote el límite de tiempo (en segundos) (-B), el proceso en los nodos remotos finalizará.

El modo asincrónico se adapta mejor a los comandos de shell de ejecución prolongada o las actualizaciones de software. Ejecutar el módulo de copia de forma asincrónica, por ejemplo, no realiza una transferencia de archivos en segundo plano.

Tareas asincrónicas del libro de jugadas

Playbooks también admite el modo asincrónico y el sondeo, con una sintaxis simplificada. Puede usar el modo asíncrono en los libros de jugadas para evitar tiempos de espera de conexión o para evitar bloquear tareas posteriores. El comportamiento del modo asincrónico en un libro de jugadas depende del valor de poll.

Evite tiempos de espera de conexión: encuesta> 0

Si desea establecer un límite de tiempo de espera más largo para una determinada tarea en su libro de jugadas, use async con poll establecido en un valor positivo. Ansible seguirá bloqueando la siguiente tarea en su libro de jugadas, esperando hasta que la tarea asíncrona se complete, falle o se agote el tiempo de espera. Sin embargo, la tarea solo expirará si excede el límite de tiempo de espera que estableció con el async parámetro.

Para evitar tiempos de espera en una tarea, especifique su tiempo de ejecución máximo y la frecuencia con la que le gustaría sondear el estado:

----hosts: all
  remote_user: root

  tasks:-name: Simulate long running op (15 sec), wait for up to 45 sec, poll every 5 sec
    ansible.builtin.command: /bin/sleep 15
    async:45poll:5

Nota

El valor de encuesta predeterminado lo establece el DEFAULT_POLL_INTERVAL configuración. No hay ningún valor predeterminado para el límite de tiempo asincrónico. Si deja la palabra clave ‘async’, la tarea se ejecuta sincrónicamente, que es el valor predeterminado de Ansible.

Nota

A partir de Ansible 2.3, async no admite el modo de verificación y fallará la tarea cuando se ejecute en modo de verificación. Ver Validación de tareas: modo check y modo diff sobre cómo omitir una tarea en el modo de verificación.

Ejecutar tareas al mismo tiempo: poll = 0

Si desea ejecutar varias tareas en un libro de jugadas al mismo tiempo, use async con poll establecer en 0. Cuando estableces poll: 0, Ansible inicia la tarea e inmediatamente pasa a la siguiente sin esperar un resultado. Cada tarea asincrónica se ejecuta hasta que se completa, falla o se agota el tiempo de espera (se ejecuta más tiempo que su async valor). La ejecución del libro de jugadas finaliza sin volver a comprobar las tareas asincrónicas.

Para ejecutar una tarea del libro de jugadas de forma asincrónica:

----hosts: all
  remote_user: root

  tasks:-name: Simulate long running op, allow to run for 45 sec, fire and forget
    ansible.builtin.command: /bin/sleep 15
    async:45poll:0

Nota

No especifique un valor de encuesta de 0 con operaciones que requieren bloqueos exclusivos (como transacciones yum) si espera ejecutar otros comandos más adelante en el libro de jugadas contra esos mismos recursos.

Nota

Usando un valor más alto para --forks dará como resultado el inicio de tareas asincrónicas aún más rápido. Esto también aumenta la eficiencia del sondeo.

Si necesita un punto de sincronización con una tarea asíncrona, puede registrarlo para obtener su ID de trabajo y usar el async_status módulo para observarlo en una tarea posterior. Por ejemplo:

-name: Run an async task
  ansible.builtin.yum:name: docker-io
    state: present
  async:1000poll:0register: yum_sleeper

-name: Check on an async task
  async_status:jid:" yum_sleeper.ansible_job_id "register: job_result
  until: job_result.finished
  retries:100delay:10

Nota

Si el valor de async: no es lo suficientemente alto, esto hará que la tarea “verificarlo más tarde” falle porque el archivo de estado temporal que el async_status: está buscando no se habrá escrito o ya no existe

Para ejecutar varias tareas asincrónicas y al mismo tiempo limitar la cantidad de tareas que se ejecutan al mismo tiempo:

###################### main.yml#####################-name: Run items asynchronously in batch of two items
  vars:sleep_durations:-1-2-3-4-5durations:" item "include_tasks: execute_batch.yml
  loop:" list "###################### execute_batch.yml#####################-name: Async sleeping for batched_items
  ansible.builtin.command: sleep  async_item async:45poll:0loop:" durations "loop_control:loop_var:"async_item"register: async_results

-name: Check sync status
  async_status:jid:" async_result_item.ansible_job_id "loop:" async_results.results "loop_control:loop_var:"async_result_item"register: async_poll_results
  until: async_poll_results.finished
  retries:30

Ver también

Controlar la ejecución del libro de jugadas: estrategias y más

Opciones para controlar la ejecución del libro de jugadas

Introducción a los libros de jugadas

Introducción a los libros de jugadas

Lista de correo de usuarios

¿Tengo una pregunta? ¡Pasa por el grupo de google!

irc.freenode.net

#ansible canal de chat de IRC