it-swarm.com.de

Ansible: Bereitstellen auf mehreren Hosts gleichzeitig

Ist es möglich, ein ansible-Playbook auszuführen, das so aussieht (es ist ein Beispiel von dieser 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

im Multithread-Modus?

Ich möchte drei "Includes" gleichzeitig ausführen (es wird sowieso auf verschiedenen Hosts bereitgestellt), wie in diesem Diagramm dargestellt:

http://www.gliffy.com/go/publish/5267618

Ist es möglich?

48
sebaszw

Ab Ansible 2.0 scheint es in einem Playbook eine Option namens strategy zu geben. Wenn Sie die Strategie auf free setzen, spielt das Playbook Aufgaben auf jedem Host ab, ohne auf die anderen zu warten. Siehe http://docs.ansible.com/ansible/playbooks_strategies.html .

Es sieht ungefähr so ​​aus (entnommen aus dem obigen Link):

- hosts: all
  strategy: free
  tasks:
  ...

Bitte beachten Sie, dass ich dies nicht überprüft habe und ich sehr neu bei Ansible bin. Ich war nur neugierig darauf, das zu tun, was Sie beschrieben haben, und bin zufällig auf diese Strategiesache gekommen.

BEARBEITEN:

Es scheint, dass dies nicht genau das ist, was Sie versuchen zu tun. Vielleicht ist "asynchrone Aufgaben" besser geeignet, wie hier beschrieben: http://docs.ansible.com/ansible/playbooks_async.html .

Dies beinhaltet die Angabe von async und poll für eine Aufgabe. Folgendes stammt aus dem 2. Link, den ich erwähnt habe:

- name: simulate long running op, allow to run for 45 sec, fire and forget
  command: /bin/sleep 15
  async: 45
  poll: 0

Ich denke, Sie können async mal länger angeben, wenn Ihre Aufgabe langwierig ist. Sie können wahrscheinlich Ihre drei gleichzeitigen Aufgaben auf diese Weise definieren.

29
Amir Eldor

Standardmäßig versucht Ansible, auf allen Hosts gleichzeitig ausgeführt zu werden. Siehe diese Ansible-Dokumente für Details. Sie können auch den Parameter serial verwenden, um die Anzahl der parallelen Hosts zu begrenzen, die Sie zu einem bestimmten Zeitpunkt verarbeiten möchten. Wenn Sie also ein Playbook auf jeweils nur einem Host ausführen möchten, können Sie serial:1, etc.

Ansible ist so konzipiert, dass jede Aufgabe auf allen Hosts ausgeführt wird, bevor mit der nächsten Aufgabe fortgefahren wird. Wenn Sie also 3 Aufgaben haben, wird sichergestellt, dass Aufgabe 1 zuerst auf allen Hosts ausgeführt wird, dann wird Aufgabe 2 ausgeführt, und dann wird Aufgabe 3 ausgeführt. Siehe dieser Abschnitt der Ansible-Dokumentation für weitere Einzelheiten dazu.

27
Bruce P

Wie bereits erwähnt: Standardmäßig versucht Ansible, auf allen Hosts gleichzeitig, jedoch Task für Task (seriell), ausgeführt zu werden.

Wenn Sie Tasks auch parallel ausführen möchten, müssen Sie verschiedene Instanzen von ansible starten. Hier sind einige Wege dazu.

1. Gruppen

Wenn Sie bereits verschiedene Gruppen haben, können Sie für jede Gruppe eine sichtbare Instanz ausführen:

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. Mehrere Muscheln

Spielbücher

Wenn Ihre Playbooks eigenständig funktionieren, können Sie dies trotzdem tun:

Shell-1 #> ansible-playbook load_balancers.yml
Shell-2 #> ansible-playbook webservers.yml
Shell-3 #> ansible-playbook dbservers.yml

Grenze

Wenn nicht, können Sie die Fragmentierung von ansible durchführen lassen. Wenn Sie 6 Hosts haben und 3 Instanzen mit jeweils 2 Hosts ausführen möchten, können Sie Folgendes tun:

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. Hintergrund

Natürlich können Sie eine Shell verwenden und die Aufgaben in den Hintergrund stellen. Ein einfaches Beispiel wäre:

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] &

Mit dieser Methode werden alle Ausgaben in einem Terminal gemischt. Um dies zu vermeiden, können Sie die Ausgabe in verschiedene Dateien schreiben.

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. Bessere Lösungen

Vielleicht ist es besser, ein Tool wie tmux/screen zu verwenden, um die Instanzen in virtuellen Shells zu starten.

Oder schauen Sie sich den "Feuerball-Modus" an: http://jpmens.net/2012/10/01/dramatisch-schneller-durchführbarer-Lauf

Weitere Informationen zu Limits finden Sie hier: https://docs.ansible.com/playbooks_best_practices.html#what-this-organization-enables-examples

20
xxorde

In meinem Fall musste die Konfigurationsphase als Ganzes blockieren, aber jede Rolle parallel ausführen. Ich habe dieses Problem mit dem folgenden Code behoben:

echo webserver loadbalancer database | tr ' ' '\n' \
| xargs -I % -P 3 bash -c 'ansible-playbook $1.yml' -- %

das Argument -P 3 in xargs stellt sicher, dass alle Befehle parallel ausgeführt werden. Jeder Befehl führt das jeweilige Playbook aus und der Befehl wird als Ganzes blockiert, bis alle Teile fertig sind.

1
Vlassios