5

What configuration is needed to correctly format the standard stream output from tasks in an Ansible ansible-playbook run?

What I run ansible-playbook foo.yaml the output from tasks includes the standard stream (stdout, stderr) content. But the display of these is in a big JSON single-line blob, and not printed as the formatted lines that were sent to the stream.

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 \"admin@example.com\"", "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"]}

What is causing this unwanted formatting of the output? How can I tell Ansible to always format the stream output correctly for display in the ansible-playbook output?

bignose
  • 992
  • 1
  • 10
  • 22
  • 1
    Does this answer your question? [Display output with Ansible](https://serverfault.com/questions/640130/display-output-with-ansible) – dyasny Aug 25 '20 at 22:53
  • That helped, but the answer at that question isn't great. I'll summarise an actual answer here. Thanks. – bignose Aug 26 '20 at 00:02
  • 1
    The answer really is to use a callback plugin that suits your needs. There are quite a few – dyasny Aug 26 '20 at 11:13

1 Answers1

9

Ansible defaults to a machine-readable JSON output, not suitable for human reading. But there are other “callback” modules available, some of which can format the stream output.

  • The misleadingly-named debug module is more suitable for human viewing.
  • Recently, the yaml module formats the stream output as a easy-to-read YAML document.

So, using the ANSIBLE_STDOUT_CALLBACK environment variable:

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

will change the formatting of stream output:

[…]
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 "admin@example.com
  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
bignose
  • 992
  • 1
  • 10
  • 22