Ansible: Wie führe ich einen Task Host für Host aus?


14

Auf der Spielebene müssen wir serial: 1zulassen, dass wir das gesamte Spiel jeweils als Host ausführen können. Aber ich habe keinen einfachen Weg gefunden, dies für eine einzelne Aufgabe zu tun. Dies ist insbesondere dann relevant, wenn die betreffende Task (aus welchen Gründen auch immer) keine ordnungsgemäße Sperrung durchführt.

Eine naheliegende Antwort ist, die Aufgabe selbst in die Hand zu nehmen. Bei Rollen hilft das aber nicht. ( serial: 1Das Stück mit der Rolle spielen zu müssen, ist nicht wirklich intuitiv.)

Antworten:


10

Wenn Sie bei der Ausführung der Schritte in Ihrem Playbook keine Parallelität wünschen, stellen Sie den Gabelungspegel auf 1:

ansible-playbook --forks=1 ...

Sie können dies auch in Ihre ansible cfg-Datei einfügen:

[defaults]
forks=1

Wenn Sie dies jedoch individuell möchten, verwenden Sie die obige Befehlszeilenoption.

BEARBEITEN:

serial: 1macht etwas völlig anderes: Das ist, als würde man das Playbook für jeden Host nacheinander ausführen und auf den Abschluss des kompletten Playbooks warten, bevor man zum nächsten Host übergeht. forks=1bedeutet, dass die erste Aufgabe in einem Spiel auf einem Host ausgeführt wird, bevor die gleiche Aufgabe auf dem nächsten Host ausgeführt wird, sodass die erste Aufgabe für jeden Host ausgeführt wird, bevor die nächste Aufgabe berührt wird.

Sie möchten also forks=1nur ein Stück spielen. leider ist das momentan nicht möglich.


2
Ich wollte das nicht für ein ganzes Spielbuch festlegen. Das ist viel zu unkörnig. serial: 1Lass es mich wenigstens auf ein Stück setzen. Aber ich möchte es nur auf einen Unterpunkt eines Stücks setzen (was auch immer der richtige Name dafür ist. Ich dachte, es war "Aufgabe", aber obiger Kommentar scheint nicht zu stimmen).
Elrond,

3
serial: 1macht etwas völlig anderes: Das ist, als würde man das Playbook für jeden Host nacheinander ausführen und auf den Abschluss des kompletten Playbooks warten, bevor man zum nächsten Host übergeht. forks=1bedeutet, dass die erste Aufgabe in einem Spiel auf einem Host ausgeführt wird, bevor die gleiche Aufgabe auf dem nächsten Host ausgeführt wird, sodass die erste Aufgabe für jeden Host ausgeführt wird, bevor die nächste Aufgabe berührt wird. Sie möchten also forks=1nur ein Stück spielen. leider ist das momentan nicht möglich.
Wurtel

Guter Punkt! Würde es Ihnen etwas ausmachen, das zur Antwort hinzuzufügen?
Elrond,

1

Wenn Sie es auf einem einzelnen Computer ausführen, tritt das Problem der exklusiven Sperren für mehr als einen Host auf. Sie sollten also einen nach dem anderen für alle Hosts ausführen. Dazu müssen Sie --forks=1beim Aufrufen eines ansible-Playbook-Befehls festgelegt sein. Zum Beispiel: ansible-playbook webserver.yml --forks=1wo webserver.yml app01 und app02 in Ihrem hat[webserver]


1

Es gibt eine Problemumgehung für dieses Problem - man kann eine Liste von Hosts (oder einer Gruppe) übergeben with_itemsund dann delegate_tomit dieser Liste verwenden. Auf diese Weise wird die Aufgabe Host für Host ausgeführt.

Beispielsweise:

- name: start and enable rabbitmq (run task host by host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true

Wenn Sie sich fragen, warum das so run_once: trueist, probieren Sie es aus. Sie werden nicht mögen, was passiert. (so viele wiederholte Läufe aaaahhhh)
Almenon

0

Denken Sie, was Sie wollen, ist

run_once: true


4
nope: "run_once: true" bedeutet, dass die Task für genau einen Host in der Liste der Hosts ausgeführt wird. Ich möchte es für jeden Host in der Liste ausführen, aber nacheinander.
Elrond

0

Verwenden Sie für Befehle, die lokal ausgeführt werden können, eine Schleife, um alle Hosts im Spiel zu durchlaufen. Dies funktioniert NUR, wenn der Befehl lokal ausgeführt werden kann. Sie können auf diese Weise auch einen Befehl mit ssh einzeln für die Remotecomputer ausführen, wenn die Schlüssel eingerichtet sind. Wenn Sie jedoch von Eskalation sprechen, wird dies schwierig.

Z.B:

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"

1
Sie müssen eine Liste von Hosts angeben, anstatt nur den Hostnamen anzugeben inventory_hostname, da sonst die Schleife keinen Sinn ergibt.
Konstantin Suvorov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.