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?

44
demandé sur mtpettyp 2014-01-16 14:05:28

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.

24
répondu Amir Eldor 2016-06-19 21:48:54

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.

22
répondu Bruce P 2014-01-16 19:27:36

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

17
répondu xxorde 2015-04-14 11:49:09

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.

1
répondu Vlassios 2016-01-31 12:03:02