Welche Konfiguration ist erforderlich, um die Standard-Stream-Ausgabe von Aufgaben in einem Ansible- ansible-playbook
Lauf korrekt zu formatieren?
Die Ausgabe der Tasks , die ich ausführe, ansible-playbook foo.yaml
enthä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-playbook
Ausgabe?
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 benannte
debug
Modulist für die menschliche Betrachtung besser geeignet. - Vor kurzem
yaml
Modulformatiert die Stream-Ausgabe als leicht lesbares YAML-Dokument.
Verwenden Sie daher die ANSIBLE_STDOUT_CALLBACK
Umgebungsvariable:
$ 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.cfg
im 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: debug
gibt 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.