Est-il possible d'exécuter ansible playbook, qui ressemble à ceci (il s'agit d'un exemple tiré de ce site: 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 mode multithread?
Je veux exécuter trois "comprend" dans le même temps (il se déploie de toute façon sur différents hôtes), comme dans ce diagramme:
http://www.gliffy.com/go/publish/5267618
C'est possible?
Depuis Ansible 2.0, il semble exister une option appelée strategy
sur un playbook. Lorsque vous définissez la stratégie sur free
, le livre de lecture exécute les tâches sur chaque hôte sans attendre les autres. Voir http://docs.ansible.com/ansible/playbooks_strategies.html .
Cela ressemble à ceci (tiré du lien ci-dessus):
- hosts: all
strategy: free
tasks:
...
Veuillez noter que je n'ai pas vérifié cela et que je suis très nouveau dans Ansible. J'étais simplement curieux de faire ce que vous avez décrit et il s'est avéré que c'était une stratégie.
MODIFIER:
Il semble que ce ne soit pas exactement ce que vous essayez de faire. Peut-être que "tâches asynchrones" est plus approprié que décrit ici: http://docs.ansible.com/ansible/playbooks_async.html .
Ceci inclut la spécification de async
et poll
sur une tâche. Ce qui suit est tiré du 2ème lien que j'ai mentionné:
- name: simulate long running op, allow to run for 45 sec, fire and forget
command: /bin/sleep 15
async: 45
poll: 0
Je suppose que vous pouvez spécifier des durées plus longues async
si votre tâche est longue. Vous pouvez probablement définir vos trois tâches simultanées de cette façon.
Par défaut, Ansible tentera de s'exécuter sur tous les hôtes en parallèle. Voir ces documents Ansible pour plus de détails. Vous pouvez également utiliser le paramètre serial
pour limiter le nombre d’hôtes parallèles que vous souhaitez traiter à un moment donné. Ainsi, si vous voulez qu’un livre de lecture ne fonctionne que sur un seul hôte à la fois, vous pouvez spécifier serial:1
, etc.
Ansible est conçu pour que chaque tâche soit exécutée sur tous les hôtes avant de passer à la tâche suivante. Donc, si vous avez 3 tâches, la tâche 1 sera exécutée en premier sur tous vos hôtes, puis la tâche 2 sera exécutée, puis la tâche 3 sera exécutée. Voir cette section de la documentation Ansible pour plus de détails à ce sujet.
Comme mentionné précédemment: par défaut, Ansible tentera de s'exécuter sur tous les hôtes en parallèle, mais tâche après tâche (série).
Si vous souhaitez également exécuter des tâches en parallèle, vous devez démarrer différentes instances de ansible. Voici quelques façons de le faire.
Si vous avez déjà différents groupes, vous pouvez exécuter une instance ansible pour chaque groupe:
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
Si vos playbooks fonctionnent de manière autonome, vous pouvez le faire:
Shell-1 #> ansible-playbook load_balancers.yml
Shell-2 #> ansible-playbook webservers.yml
Shell-3 #> ansible-playbook dbservers.yml
Sinon, vous pouvez laisser ansible faire la fragmentation. Lorsque vous avez 6 hôtes et que vous voulez exécuter 3 instances avec 2 hôtes chacune, vous pouvez faire quelque chose comme ceci:
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]
Bien sûr, vous pouvez utiliser un seul shell et placer les tâches en arrière-plan. Voici un exemple simple:
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] &
Avec cette méthode, toutes les sorties sont mélangées dans un même terminal. Pour éviter cela, vous pouvez écrire le résultat dans différents fichiers.
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 &
Peut-être est-il préférable d'utiliser un outil tel que tmux/screen pour démarrer les instances dans des shells virtuels.
Ou jetez un coup d'œil au "mode boule de feu": http://jpmens.net/2012/10/01/dramically-speeding-up-ansible-runs/
Si vous voulez en savoir plus sur les limites, regardez ici: https://docs.ansible.com/playbooks_best_practices.html#what-this-organization-enables-examples
Dans mon cas, la phase de configuration devait être bloquée dans son ensemble, mais exécuter chaque rôle en parallèle. J'ai résolu ce problème en utilisant le code suivant:
echo webserver loadbalancer database | tr ' ' '\n' \
| xargs -I % -P 3 bash -c 'ansible-playbook $1.yml' -- %
l'argument -P 3 dans xargs garantit que toutes les commandes sont exécutées en parallèle, chaque commande exécute le playbook respectif et la commande est bloquée dans son ensemble jusqu'à ce que toutes les parties soient terminées.