Kontext
Ich habe ein Ansible-Playbook, das eine sehr lange Aufgabe von bis zu einer Stunde enthält.
Sehr vereinfacht sieht es so aus:
- hosts: localhost
tasks:
- name: Short task
debug:
msg: "I'm quick!"
- name: Long task
shell: "sleep 15s"
Wenn der Benutzer das Playbook ausführt, lautet die Ausgabe zunächst:
PLAY [localhost] ********************
TASK [Gathering Facts] **************
ok: [127.0.0.1]
TASK [Short task] *******************
ok: [127.0.0.1] => {
"msg": "I'm quick!"
}
(hang there until Long task is done)
TASK [Long task] ********************
changed: [127.0.0.1]
Problem
Die Endbenutzer des Playbooks glauben, dass ein Problem vorliegt Short task
, da es dort hängt und Long task
die Verzögerung verursacht.
Frage
Wie kann ich Ansible oder das Playbook so konfigurieren, dass die inname:
Vordie Aufgabe ausführen?
Ich möchte eine Ausgabe wie die folgende erzielen:
PLAY [localhost] ********************
TASK [Gathering Facts] **************
ok: [127.0.0.1]
TASK [Short task] *******************
ok: [127.0.0.1] => {
"msg": "I'm quick!"
}
TASK [Long task] ********************
(and hang there during the execution)
changed: [127.0.0.1]
Antwort1
Auf Anfrage des OP wird mein Kommentar in eine Antwort umgewandelt
Ich verwende Ansible 2.9.2.
Ich habe es ohne Konfigurationsdatei und mit einer Konfigurationsdatei ohne deklarierten Wert stdout_callback
(Standard) versucht. Ich kann Ihr Problem in beiden Fällen nicht reproduzieren.
Dies ist mein Test-Playbook:
---
- hosts: localhost
gather_facts: false
tasks:
- name: Short running
debug:
msg: I'm a short task
- name: LOOOOOOOOOng task
shell: sleep 2000
Und das Ergebnis (in beiden Fällen. Hinweis: Unterbrechung durch Benutzer nach Anzeige der Aufgabenüberschrift)
$ ansible-playbook /tmp/play.yml
PLAY [localhost] **************************************************************************************************************************************************************************************************
TASK [Short running] **********************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "I'm a short task"
}
TASK [LOOOOOOOOOng task] ******************************************************************************************************************************************************************************************
^C [ERROR]: User interrupted execution
Überprüfen Sie noch einmal, welche Konfigurationsdatei Sie in dem Verzeichnis laden ansible-playbook --version
, in dem Sie das Playbook starten möchten. Ich schlage auch vor, dass Sie es ohne Konfigurationsdatei versuchen, um zu sehen, ob das Ihr Problem behebt (und dann sehen Sie, welche Einstellung das Problem tatsächlich verursacht).
Hinzugefügt aus dem Kommentar des OP: Es stellte sich heraus, dass die problematische Einstellung in ansible.cfg in diesem speziellen Fall wardisplay_skipped_hosts=False
Antwort2
Das display_skipped_hosts=false
in /etc/ansible/ansible.cfg hat das Problem für mich behoben.
Ist das ein Fehler? Ich möchte die übersprungenen Hosts nicht sehen, aber den Fortschritt meines Playbooks.
Verwenden von Ansible 2.10.3
Antwort3
Für diejenigen, die übersprungene Aufgaben dennoch verbergen möchten, gibt es jetzt zwei Möglichkeiten:
- Verwendung derStandard-Callback-Pluginund durch die Einstellung
display_skipped_hosts = False
undshow_per_host_start = True
wird eine weitere Protokollzeile hinzugefügt, wenn jede Aufgabe gestartet wird. Dies führt jedoch nicht ganz zu dem Verhalten, nur den Titel rechtzeitig auszugeben (und erscheint manchmal auch, nachdem eine Aufgabe bereits erledigt ist, was die Lesbarkeit erschwert). - Verwenden Sie weiterhin die (mittlerweile veraltete)Skippy-Plugindas war das Standard-Plugin, bevor das Standard-Plugin die Funktion zum Überspringen bekam. Es funktioniert immer noch wie erwartet mit 2.11 und ist auch meine bevorzugte Lösung dafür. Stellen Sie es
stdout_callback = skippy
in Ihrer ansible.cfg ein. Nur um sicherzugehen, habe ich das Plugin auch mitcallback_enabled = ansible.posix.skippy
Meine ansible.cfg sieht jetzt so aus und alles funktioniert wie vor der Migration auf die neueste ansible.cfg mit Standardwerten:
[default]
# ...
stdout_callback = skippy
# if you had other plugins here just add to list, comma seperated
callback_enabled = ansible.posix.skippy
# deprecated flag, sometimes still needed, hence I always set both
callback_whitelist = ansible.posix.skippy
# ...
Weiterführende Literatur:
- Ticket zum Problem:https://github.com/ansible/ansible/issues/51042
- PR, der die Funktion zum Standard-Plugin eingeführt hat, um Starttask-Ausgabe hinzuzufügenhttps://github.com/ansible/ansible/pull/53819
- Neueste Dokumente für das Standard-Pluginhttps://docs.ansible.com/ansible/latest/collections/ansible/builtin/default_callback.html
- Neueste Dokumente zum Skippy-Pluginhttps://docs.ansible.com/ansible/latest/collections/ansible/posix/skippy_callback.html
- So richten Sie Callback-Plugins einhttps://docs.ansible.com/ansible/latest/plugins/callback.html
Antwort4
In meinem Fall habe ich die „kostenlose“ Strategie verwendet, bei der die Kopfzeile erst angezeigt wird, wenn die Aufgabe abgeschlossen ist.