Ansible: déploiement sur plusieurs hôtes en même temps
Est-il possible d'exécuter ansible playbook, qui ressemble à ceci (c'est un exemple 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 lancer trois "includes" en même temps (il se déploie de toute façon sur des machines différentes), comme dans ce diagramme:
http://www.gliffy.com/go/publish/5267618
Est-ce possible?
4 réponses
à partir de Ansible 2.0 Il semble y avoir une option appelée strategy
sur un playbook. Lors de la définition de la stratégie d' free
, le playbook joue des tâches sur chaque hôte sans attendre les autres. Voir http://docs.ansible.com/ansible/playbooks_strategies.html.
Il ressemble à quelque chose comme ceci (prises à partir du lien ci-dessus):
- hosts: all
strategy: free
tasks:
...
s'il vous Plaît noter que je n'ai pas vérifier cela et je suis très nouveau pour Ansible. J'étais juste curieux au sujet de faire ce que vous avez décrit cette stratégie et vous l'avez trouvée.
EDIT:
Il semble que ce n'est pas exactement ce que vous essayez de faire. Peut-être que "tâches async" est plus approprié comme décrit ici: http://docs.ansible.com/ansible/playbooks_async.html.
ceci inclut la spécification async
et poll
sur une tâche. Ce qui suit est tiré le 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 plus async
fois si votre tâche est longue. Vous pouvez probablement définir vos trois tâches concurrentes de cette façon.
Par défaut Ansible tentera de s'exécuter sur tous les hôtes en parallèle. Voir ces Ansible docs pour plus de détails. Vous pouvez également utiliser le serial
paramètre pour limiter le nombre de parallèles hôtes vous voulez être traitées à un moment donné, donc si vous voulez avoir un playbook exécuté sur un hôte à la fois, vous pouvez spécifier serial:1
, etc.
Ansible est conçu de sorte que chaque tâche sera exécutée sur tous les hôtes avant de continuer à la tâche suivante. Donc, si vous avez 3 tâches, assurez-vous que la tâche 1 tourne sur tous vos hôtes d'abord, puis que la tâche 2 est exécutée, puis que la tâche 3 est exécutée. Voir cette section de l'Ansible docs pour plus de détails sur cette.
comme mentionné ci-dessus: 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 voulez également exécuter des tâches en parallèle, vous devez lancer différentes instances d'ansible. Voici quelques façons d'.
1. Les groupes
si vous avez déjà des groupes différents, vous pouvez lancer une instance possible 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
2. Plusieurs obus
tablettes playbook
Si votre tablettes playbook travail autonome, vous pouvez bien faire ceci:
shell-1 #> ansible-playbook load_balancers.yml
shell-2 #> ansible-playbook webservers.yml
shell-3 #> ansible-playbook dbservers.yml
Limite
si non, vous pouvez laisser ansible faire la fragmentation. Quand vous avez 6 hosts et que vous voulez lancer 3 instances avec 2 hosts 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]
3. Arrière-plan
bien sûr, vous pouvez utiliser un shell et de mettre les tâches en arrière-plan, un exemple simple serait:
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 vous obtenez toutes les sorties mélangées ensemble dans un terminal. Pour éviter cela, vous pouvez écrire la sortie à 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 &
4. De Meilleures Solutions
peut-être qu'il est préférable d'utiliser un outil comme tmux / screen pour démarrer les instances dans les shells virtuels.
Ou avoir un coup d'oeil à la "boule de feu" mode: http://jpmens.net/2012/10/01/dramatically-speeding-up-ansible-runs/
Si vous souhaitez en savoir plus sur les limites, regardez ici: https://docs.ansible.com/playbooks_best_practices.html#what-this-organization-enables-examples
dans mon cas, j'avais besoin de l'étape de configuration pour bloquer dans son ensemble, mais exécuter chaque rôle en parallèle. J'ai abordé cette question en utilisant le code suivant:
echo webserver loadbalancer database | tr ' ' '\n' \
| xargs -I % -P 3 bash -c 'ansible-playbook .yml' -- %
l'argument-P 3 dans xargs s'assure que toutes les commandes sont exécutées en parallèle, chaque commande exécute le playbook respectif et la commande en bloc jusqu'à ce que toutes les parties soient terminées.