Ansible: Ein Host wird in mehr als einer Gruppe angezeigt, und beide Gruppen haben dieselben Aufgaben. Wie kann man Aufgaben einmal ausführen?

9

Ich habe ein Spielbuch, das ungefähr so ​​aussieht:

---
- hosts: group1
  roles:
    - role1
    - role2

- hosts: group2
  roles:
    - role2
    - role3

Angenommen, ich habe eine Hosts-Datei mit einem Eintrag wie dem folgenden:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible führt die Aufgaben in Rolle2 ZWEIMAL für host1.example.com aus, da sie in zwei Gruppen angezeigt werden und jeder Rolle2 zugewiesen ist.

Wie kann ich Ansible klar machen, dass dieselbe Rolle zweimal enthalten ist und daher nur einmal ausgeführt werden sollte?

Asfand Qazi
quelle
Es wäre besser, uns echte Beispiele zu geben, anstatt "Rolle1", "Rolle2" usw., weil Sie es vielleicht anders machen sollten. Aber es hängt davon ab, was Sie tatsächlich erreichen wollen.
Antonis Christofides

Antworten:

10

Wie bereits erwähnt, ist dies beabsichtigt. Ansible führt jeweils nur ein Spiel aus. Ihr Playbook besteht aus zwei Spielen (die beiden Elemente in der YAML-Liste auf Stammebene, die durch die Playbook-Datei definiert sind). Das erste Spiel wendet Rolle1 und Rolle2 auf Gruppe1 an. Dieses Spiel wird zuerst ausgeführt, und erst wenn es beendet ist, beginnt das zweite Spiel. Ansible versucht jedoch nicht, die Spiele logisch zusammenzuführen. Schließlich möchten Sie möglicherweise, dass die Aufgaben in Rolle2 zweimal ausgeführt werden.

Um das Problem zu beheben, gibt es einige Möglichkeiten, wie Sie dies umgehen können. Welche Sie auswählen, hängt von den Details der Gruppen und Rollen ab.

Wenn alle Aufgaben in Rolle2 idempotent sind, dh wenn sie mehrmals ausgeführt werden können und jedes Mal das gleiche Ergebnis erzielen, verlieren Sie nur Zeit, und es ist in Ordnung, die Rollen wiederholen zu lassen. Wenn die Bewerbung der Rollen sehr lange dauert oder wenn Sie sie nicht idempotent machen können, sollten Sie die folgenden Ideen berücksichtigen:


Sie können das Spielbuch in drei Spiele aufteilen und die Rollen einzeln anwenden:

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

Wenn Ihre Rollen zusammen gruppiert werden müssen, können Sie eine dritte Gruppe für die Server erstellen, die alle drei Rollen benötigen. Sie müssen sie nicht aus den beiden anderen Gruppen herausnehmen. Sie können die Gruppe in Ihrer Inventardatei wie folgt erstellen:

[group1and2:children]
group1
group2

Dann könnten Sie in Ihrem Spielbuch wieder in drei Spiele aufteilen, aber die dritte Gruppe verwenden, um zu vermeiden, dass Rollen erneut ausgeführt werden:

---
- hosts: group1:!group1and2
  roles:
    - role1
    - role2

 - hosts: group1and2
   roles:
     - role1
     - role2
     - role3

 - hosts: group2:!group1and2
   roles:
     - role2
     - role3

Das ist ziemlich hässlich, kann aber in einigen Fällen nützlich sein.

Daveadams
quelle
Vielen Dank, ich denke, ich werde eine Variante von Option (2) wählen - ich werde meine Gruppen und Rollen detaillierter gestalten, um meine Server zusammenzufassen.
Asfand Qazi
Wenn ich Hosts über eine Variable wie {{host1}} und {{host2}} aufrufe, wie kann ich sie zusammenstellen?
BMW
Wenn Sie nach Dokumentationsabschnitten suchen: Allgemeine Muster
Sahap Asci
3

Dies ist beabsichtigt. Der einzige Weg wäre, Rolle2 nur in einem Spielbuch auf eine bestimmte Gruppe anzuwenden und Rolle2 nicht in einem anderen Spielbuch einer Gruppe zu verwenden, die möglicherweise gemeinsame Mitglieder hat, wie hier.

Serge van Ginderachter
quelle