tutorial tower source open logo hat ansible

tower - Ansible: implementar en mĂșltiples hosts en el mismo tiempo



ansible tutorial (4)

A partir de Ansible 2.0, parece haber una opción llamada strategy en un libro de jugadas. Al configurar la estrategia para que sea free , el libro de jugadas ejecuta tareas en cada host sin esperar a los demás. Ver http://docs.ansible.com/ansible/playbooks_strategies.html .

Se ve algo así (tomado del enlace de arriba):

- hosts: all strategy: free tasks: ...

Tenga en cuenta que no compré esto y soy muy nuevo en Ansible. Solo tenía curiosidad por hacer lo que describiste y por casualidad llegué a esta estrategia.

EDITAR:

Parece que esto no es exactamente lo que intentas hacer. Tal vez las "tareas asíncronas" sean más apropiadas como se describe aquí: http://docs.ansible.com/ansible/playbooks_async.html .

Esto incluye especificar async y poll en una tarea. Lo siguiente está tomado del segundo enlace que mencioné:

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

Supongo que puede especificar tiempos de async más largos si su tarea es larga. Probablemente pueda definir sus tres tareas simultáneas de esta manera.

¿Es posible ejecutar el libro de jugadas ansible, que se ve así (es un ejemplo de este sitio: http://docs.ansible.com/playbooks_roles.html ):

- name: this is a play at the top level of a file hosts: all remote_user: root tasks: - name: say hi tags: foo shell: echo "hi..." - include: load_balancers.yml - include: webservers.yml - include: dbservers.yml

en modo multithread?

Quiero ejecutar tres "includes" al mismo tiempo (de todos modos se está implementando en diferentes hosts), como en este diagrama:

http://www.gliffy.com/go/publish/5267618

¿Es posible?


Como se mencionó anteriormente: de manera predeterminada, Ansible intentará ejecutarse en todos los hosts en paralelo, pero tarea tras tarea (en serie).

Si también desea ejecutar tareas en paralelo, debe iniciar diferentes instancias de ansible. Aquí hay algunas formas de hacerlo.

1. Grupos

Si ya tiene diferentes grupos, puede ejecutar una instancia ansible para cada grupo:

shell-1 #> ansible-playbook site.yml --limit webservers shell-2 #> ansible-playbook site.yml --limit dbservers shell-3 #> ansible-playbook site.yml --limit load_balancers

2. Múltiples proyectiles

Playbooks

Si tus libros de jugadas funcionan de forma independiente, puedes hacer esto:

shell-1 #> ansible-playbook load_balancers.yml shell-2 #> ansible-playbook webservers.yml shell-3 #> ansible-playbook dbservers.yml

Límite

Si no, puedes dejar que ansible haga la fragmentación. Cuando tiene 6 hosts y desea ejecutar 3 instancias con 2 host cada uno, puede hacer algo como esto:

shell-1 #> ansible-playbook site.yml --limit all[0-2] shell-2 #> ansible-playbook site.yml --limit all[2-4] shell-3 #> ansible-playbook site.yml --limit all[4-6]

3. Antecedentes

Por supuesto, puede usar un shell y poner las tareas en segundo plano, un ejemplo simple sería:

shell-1 #> ansible-playbook site.yml --limit all[0-2] & shell-1 #> ansible-playbook site.yml --limit all[2-4] & shell-1 #> ansible-playbook site.yml --limit all[4-6] &

Con este método, puedes mezclar todos los resultados en un solo terminal. Para evitar esto, puede escribir el resultado en diferentes archivos.

ansible-playbook site.yml --limit all[0-2] > log1 & ansible-playbook site.yml --limit all[2-4] > log2 & ansible-playbook site.yml --limit all[4-6] > log3 &

4. Mejores soluciones

Tal vez sea mejor usar una herramienta como tmux / screen para iniciar las instancias en shells virtuales.

O eche un vistazo al "modo bola de fuego": http://jpmens.net/2012/10/01/dramatically-speeding-up-ansible-runs/

Si quiere saber más sobre los límites, mire aquí: https://docs.ansible.com/playbooks_best_practices.html#what-this-organization-enables-examples


De manera predeterminada, Ansible intentará ejecutarse en todos los hosts en paralelo. Vea estos documentos de Ansible para más detalles. También puede usar el parámetro serial para limitar el número de hosts paralelos que desea procesar en un momento determinado, por lo que si desea que un libro de jugadas se ejecute solo en un host a la vez, puede especificar serial:1 , etc.

Ansible está diseñado para que cada tarea se ejecute en todos los hosts antes de continuar con la siguiente tarea. Entonces, si tiene 3 tareas, se asegurará de que la tarea 1 se ejecute primero en todos sus hosts, luego se ejecute la tarea 2 y luego se ejecute la tarea 3. Consulte esta sección de los documentos de Ansible para obtener más detalles sobre esto.


En mi caso, necesitaba la etapa de configuración para bloquear todo, pero ejecutar cada función en paralelo. He abordado este problema usando el siguiente código:

echo webserver loadbalancer database | tr '' '' ''/n'' / | xargs -I % -P 3 bash -c ''ansible-playbook $1.yml'' -- %

el argumento -P3 en xargs asegura que todos los comandos se ejecuten en paralelo, cada comando ejecuta el respectivo libro de jugadas y el comando como bloques completos hasta que todas las partes hayan terminado.