Logging

顯示正確格式化的 Ansible playbook 輸出

  • August 26, 2020

需要什麼配置才能正確格式化 Ansibleansible-playbook執行中任務的標準流輸出?

ansible-playbook foo.yaml從任務中執行的輸出包括標準流 ( stdout, stderr) 內容。但是這些顯示在一個大的 JSON 單行 blob 中,而不是作為發送到流的格式化行列印。

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"]}

是什麼導致了這種不需要的輸出格式?如何告訴 Ansible 始終正確格式化流輸出以ansible-playbook輸出中顯示?

Ansible 預設為機器可讀的 JSON 輸出,不適合人類閱讀。但是還有其他可用的“回調”模組,其中一些可以格式化流輸出。

  • 誤導性命名的debug模組更適合人類查看。
  • 最近,該yaml模組將流輸出格式化為易於閱讀的 YAML 文件。

因此,使用ANSIBLE_STDOUT_CALLBACK環境變數:

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

將改變流輸出的格式:

[…]
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

引用自:https://serverfault.com/questions/1031491