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.