てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Playbookの実行結果(エラー含む)を改行付きで表示する(community.general.yaml コールバックプラグイン編)

はじめに

Ansible のエラーメッセージは、改行のない JSON で表示されるため読みにくいという意見を見かけました。確かにデフォルトだとそうです。

Ansible は Playbook 実行結果をコールバックプラグインという仕組みで扱われます。いくつか種類があるのですが、たとえば、community.general.yaml コールバックプラグインを利用すると、改行付きのYAMLで表示されます。

Ansible output that can be quite a bit easier to read than the default JSON formatting.

という説明があります。

簡単な実行結果を掲載します。

  • 環境
    • ansible-core 2.14.1
    • community.general コレクション 6.1.0

[2023/04/24 追記]

デフォルトのコールバックプラグインのまま類似のことを実現したい場合は以下の記事を参照してください。

[Ansible] Playbookの実行結果(エラー含む)を改行付きで表示する(デフォルトのコールバックプラグイン編) - てくなべ (tekunabe)

おためし

設定

標準出力を扱うコールバックプラグインを変更するには、DEFAULT_STDOUT_CALLBACK という設定項目を変えます。

ansible.cfg の場合は、 defaults セクションで stdout_callback を設定します。

[defaults]
stdout_callback=community.general.yaml

また、環境変数 ANSIBLE_STDOUT_CALLBACK を使ってもOKです。

Playbook

以下の Plyabook で試します。uri モジュールで見に行こうとする url の名前解決ができないようにしてあります。

---
- name: Request
  hosts: rocky01
  gather_facts: false

  tasks:
    - name: Invalid request
      ansible.builtin.uri:
        url: https://ugui.local/dummy.json

Playbook 実行

それでは実行します。

% ansible-playbook -i inventory.ini rocky.yml 

PLAY [Request] ****************************************************************************************************

TASK [Invalid request] ********************************************************************************************
fatal: [rocky01]: FAILED! => changed=false 
  ansible_facts:
    discovered_interpreter_python: /usr/bin/python3
  elapsed: 0
  msg: 'Status code was -1 and not [200]: Request failed: <urlopen error [Errno -2] Name or service not known>'
  redirected: false
  status: -1
  url: https://ugui.local/dummy.json

PLAY RECAP ********************************************************************************************************
rocky01                    : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

メッセージが キー: バリューYAML で表示されました。

補足

デフォルトの場合

デフォルトのコールバックプラグインの場合は以下のとおりです。

% ansible-playbook -i inventory.ini rocky.yml

PLAY [Request] ****************************************************************************************************

TASK [Invalid request] ********************************************************************************************
fatal: [rocky01]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"}, "changed": false, "elapsed": 0, "msg": "Status code was -1 and not [200]: Request failed: <urlopen error [Errno -2] Name or service not known>", "redirected": false, "status": -1, "url": "https://ugui.local/dummy.json"}

PLAY RECAP ********************************************************************************************************
rocky01                    : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

実際の画面は以下のとおりです。

デフォルトのコールバックプラグイン

この情報量だと違いが出にくいですが、もっと情報量が多いとはっきりします。

yaml コールバックプラグインのありか

yaml コールバックプラグインは、Ansible 2.9 までは本体と一緒に入っていたので特に意識する必要がなかったのですが、Ansible (ansible-base) 2.10 でcommunity.general コレクションに移行しました。

おわりに

とても便利で、ansible.builtin に残ってほしかったなと思っています。デフォルトでもいいのではという意見も耳にします。