Zeigen Sie die Ansible-Playbook-Ausgabe richtig formatiert an

Zeigen Sie die Ansible-Playbook-Ausgabe richtig formatiert an

Welche Konfiguration ist erforderlich, um die Standard-Stream-Ausgabe von Aufgaben in einem Ansible- ansible-playbookLauf korrekt zu formatieren?

Die Ausgabe der Tasks , die ich ausführe, ansible-playbook foo.yamlenthält den Standardstream-Inhalt ( stdout, stderr). Diese werden jedoch in einem großen JSON-Einzelzeilen-Blob angezeigt und nicht als die formatierten Zeilen gedruckt, die an den Stream gesendet wurden.

TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => {"changed": false, "cmd": "python3 -m django createsuperuser\n  --noinput\n  --username \"admin\"\n  --email \"[email protected]\"", "msg": "\n:stderr: CommandError: You must use --full_name with --noinput.\n", "path": "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games", "syspath": ["/tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip", "/usr/lib/python37.zip", "/usr/lib/python3.7", "/usr/lib/python3.7/lib-dynload", "/usr/local/lib/python3.7/dist-packages", "/usr/lib/python3/dist-packages"]}

Was verursacht diese unerwünschte Formatierung der Ausgabe?Wie kann ich Ansible anweisen, die Stream-Ausgabe immer korrekt für die Anzeige zu formatieren?in der ansible-playbookAusgabe?

Antwort1

Ansible gibt standardmäßig eine maschinenlesbare JSON-Ausgabe aus, die nicht für das menschliche Lesen geeignet ist. Aber es gibt andere„Callback“-Module verfügbar, von denen einige die Stream-Ausgabe formatieren können.

  • Der irreführend benanntedebugModulist für die menschliche Betrachtung besser geeignet.
  • Vor kurzemyamlModulformatiert die Stream-Ausgabe als leicht lesbares YAML-Dokument.

Verwenden Sie daher die ANSIBLE_STDOUT_CALLBACKUmgebungsvariable:

$ ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook ansible/deploy.yaml

ändert die Formatierung der Stream-Ausgabe:

[…]
TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => changed=false
  cmd: |-
    python3 -m django createsuperuser
      --noinput
      --username "admin"
      --email "[email protected]
  msg: |-
    stderr: |-
      CommandError: You must use --full_name with --noinput.
    path: "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games"
    syspath: 
    - /tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip
    - /usr/lib/python37.zip
    - /usr/lib/python3.7
    - /usr/lib/python3.7/lib-dynload
    - /usr/local/lib/python3.7/dist-packages
    - /usr/lib/python3/dist-packages

Antwort2

1. Konfigurationsdatei erstellen

Um eine Ansible-Playbook-Ausgabe in ansprechendem JSON-Format zu erhalten, erstellen Sie eine Konfigurationsdatei:

  • entweder ansible.cfgim selben Verzeichnis wie die Ansible Playbook-Datei
  • oder im Home-Verzeichnis, beginnend mit einem Punkt,~/.ansible.cfg
  • oder in/etc/ansible/ansible.cfg

Quelle:https://docs.ansible.com/ansible/latest/reference_appendices/config.html

Bonus: debuggibt auch ziemlichstdout,stderrUndNachricht.

Dateiinhalt:

[defaults]
stdout_callback=debug

2. Führen Sie das Playbook aus

Führen Sie das Playbook auf genau dieselbe Weise aus wie zuvor.

ansible-playbook foo.yaml

Vergleich

Vor:

TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => {"changed": false, "cmd": "python3 -m django createsuperuser\n  --noinput\n  --username \"admin\"\n  --email \"[email protected]\"", "msg": "\n:stderr: CommandError: You must use --full_name with --noinput.\n", "path": "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games", "syspath": ["/tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip", "/usr/lib/python37.zip", "/usr/lib/python3.7", "/usr/lib/python3.7/lib-dynload", "/usr/local/lib/python3.7/dist-packages", "/usr/lib/python3/dist-packages"]}

Nach:

TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => {
  "changed": false,
  "cmd": "python3 -m django createsuperuser\n  --noinput\n  --username \"admin\"\n  --email \"[email protected]\"",
  "msg": "\n:stderr: CommandError: You must use --full_name with --noinput.\n",
  "path": "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games",
  "syspath": [
    "/tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip",
    "/usr/lib/python37.zip",
    "/usr/lib/python3.7",
    "/usr/lib/python3.7/lib-dynload",
    "/usr/local/lib/python3.7/dist-packages",
    "/usr/lib/python3/dist-packages"
  ]
}

STDERR:

CommandError: You must use --full_name with --noinput.



MSG:

CommandError: You must use --full_name with --noinput.

verwandte Informationen