Ansibleプレイブックの出力を適切にフォーマットして表示する

Ansibleプレイブックの出力を適切にフォーマットして表示する

Ansible 実行中のタスクからの標準ストリーム出力を正しくフォーマットするには、どのような構成が必要ですかansible-playbook?

タスクからの出力を実行すると、ansible-playbook foo.yaml標準ストリーム ( stdoutstderr) コンテンツが含まれます。ただし、これらの表示は大きな 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.

関連情報