web-dev-qa-db-fra.com

Ansible: déployer sur plusieurs hôtes en même temps

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?

48
sebaszw

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.

29
Amir Eldor

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.

27
Bruce P

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.

1. les groupes

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

2. Coquilles multiples

Playbooks

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

Limite

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]

3. Contexte

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 &

4. Meilleures solutions

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

20
xxorde

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.

1
Vlassios