はじめに
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
- communitu.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
に残ってほしかったなと思っています。デフォルトでもいいのではという意見も耳にします。