Frage Ansible: Ein Host wird in mehreren Gruppen angezeigt, und beide Gruppen haben dieselben Aufgaben. eine Möglichkeit, Aufgaben einmal auszuführen?


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

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

- hosts: group2
  roles:
    - role2
    - role3

Jetzt sage ich, dass ich eine Hosts-Datei habe, die einen Eintrag wie folgt hat:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible wird die Aufgaben in role2 TWICE für host1.example.com ausführen, da es in 2 Gruppen angezeigt wird und ihnen jeweils role2 zugewiesen ist.

Wie kann ich Ansible erkennen, dass es die gleiche Rolle zweimal enthält und daher sollte es nur einmal ausgeführt werden?


8
2018-02-10 13:43


Ursprung


Es wäre besser, uns echte Beispiele anstelle von "Rolle1", "Rolle2" usw. zu geben, denn vielleicht solltest du es anders machen. Aber es hängt davon ab, was Sie tatsächlich erreichen wollen. - Antonis Christofides


Antworten:


Wie bereits erwähnt, ist dies beabsichtigt. Ansible führt jeweils nur ein Spiel aus. Ihr Playbook besteht aus zwei Wiedergaben (die beiden Elemente in der Root-Level-YAML-Liste, die von der Playbook-Datei definiert werden). 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. Aber Ansible versucht 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 anzugehen, gibt es einige Möglichkeiten, wie Sie das 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 mit dem gleichen Ergebnis enden, dann ist alles, was Sie wirklich verlieren, Zeit, und es ist in Ordnung, die Rollen wiederholen zu lassen. Wenn die Rollen sehr lange brauchen, oder wenn Sie sie nicht idempotent machen können, dann überlegen Sie sich die folgenden Ideen:


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

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

Oder wenn Ihre Rollen 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 anderen beiden Gruppen herausnehmen. Sie könnten 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, aber es könnte in einigen Fällen nützlich sein.


9
2018-02-10 16:31



Danke, ich denke, ich werde mit einer Variante der Option (2) gehen. Ich werde meine Gruppen und Rollen präzisieren, um meine Server zusammen zu gruppieren. - Asfand Qazi
Wenn ich Hosts über Variable wie {{host1}} und {{host2}} anrufe, wie kann ich sie zusammensetzen? - BMW


Das ist Absicht. Der einzige Weg zu gehen wäre, Rolle2 nur in einem Playbook auf eine bestimmte Gruppe anzuwenden und nicht Rolle2 in einem anderen Playbook in einer Gruppe zu verwenden, die ähnliche Mitglieder haben könnte, wie hier.


3
2018-02-10 14:06