Ansible 実行中のタスクからの標準ストリーム出力を正しくフォーマットするには、どのような構成が必要ですかansible-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 \"[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"]}
出力のこの望ましくないフォーマットの原因は何ですか?Ansibleにストリーム出力を常に正しくフォーマットして表示するように指示するにはどうすればよいですか出力にansible-playbook
?
答え1
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 "[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
答え2
1. 設定ファイルを作成する
Ansible プレイブックの出力をきれいな JSON として適切にフォーマットするには、設定ファイルを作成します。
- または
ansible.cfg
、Ansibleプレイブックファイルと同じディレクトリ内 - または、ホームディレクトリのドットで始まる
~/.ansible.cfg
- または
/etc/ansible/ansible.cfg
ソース:参考:
ボーナス: debug
また、かなり与える標準出力、標準エラー出力そしてメッセージ。
ファイルの内容:
[defaults]
stdout_callback=debug
2. プレイブックを実行する
以前とまったく同じ方法でプレイブックを実行します。
ansible-playbook foo.yaml
比較
前に:
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"]}
後:
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.