Kontext

Kontext

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 taskdie 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=falsein /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:

  1. Verwendung derStandard-Callback-Pluginund durch die Einstellung display_skipped_hosts = Falseund show_per_host_start = Truewird 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).
  2. 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 = skippyin 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:

Antwort4

In meinem Fall habe ich die „kostenlose“ Strategie verwendet, bei der die Kopfzeile erst angezeigt wird, wenn die Aufgabe abgeschlossen ist.

verwandte Informationen