はじめに
Ansible には Playbook Debugger というPlaybookのデバッグ機能があります。
Playbook の途中のタスクで処理を止めて、変数の値を確認したり書き換えたりできるデバッグ機能です。Play や Task に debugger: 止める条件
という指定すると有効になります。
たとえば、以下のように Play に debugger: on_fialed
と指定した場合は、Play 中のいずれかのタスクでエラーが発生した場合に、処理を止めてデバッガーが起動します。
- hosts: sv gather_facts: fasle debugger: on_fialed # ポイント tasks: # 略
このように基本的に、Playbook 内での指定が必要です。ですが、上記のように Play に debugger: on_fialed
と指定することと同等のことであれば、Playbook を書き換えることなく、ansible.cfg
や環境変数で指定できます。
この記事では、その方法をご紹介します。
設定名は ENABLE_TASK_DEBUGGER
エラー時にデバッガーを起動するための設定名は ENABLE_TASK_DEBUGGER
です。
ansible.cfg
で指定する場合
[defaults] enable_task_debugger=yes
環境変数 で指定する場合
export ANSIBLE_ENABLE_TASK_DEBUGGER=yes
そのコマンド実行時だけ有効にする場合は以下の通り
ANSIBLE_ENABLE_TASK_DEBUGGER=yes ansible-playbook 略
実行例
途中でエラーが発生して、変数の値を確認、変更してそのタスクだけ最実行、という一連の流れを掲載します。
利用する Playbook は以下のとおりです。assert の条件が不一致なのでエラーが発生します。
- playbook
--- - hosts: localhost gather_facts: no vars: fish1: kingyo fish2: oikawa tasks: - name: assert fish assert: that: - fish1 == fish2
- 実行
$ ANSIBLE_ENABLE_TASK_DEBUGGER=yes ansible-playbook -i localhost, assert.yml # このコマンドのみ有効な方法で指定 PLAY [localhost] ************************************************************************************************** TASK [assert fish] *********************************************************************************************** fatal: [localhost]: FAILED! => { # assert が失敗した "assertion": "fish1 == fish2", "changed": false, "evaluated_to": false, "msg": "Assertion failed" } [localhost] TASK: assert fish (debug)> # デバッガーが起動した [localhost] TASK: assert fish (debug)> h # ヘルプの表示 Documented commands (type help <topic>): ======================================== EOF c continue h help p pprint q quit r redo u update_task [localhost] TASK: assert fish (debug)> p task_vars["fish1"] # 変数 fish1 の値を確認 'kingyo' [localhost] TASK: assert fish (debug)> p task_vars["fish2"] # 変数 fish2 の値を確認 'oikawa' [localhost] TASK: assert fish (debug)> task_vars["fish2"]="kingyo" # 変数 fish2 の値を確認 [localhost] TASK: assert fish (debug)> u # タスク変数を更新 [localhost] TASK: assert fish (debug)> r # タスクの再実行 ok: [localhost] => { "changed": false, "msg": "All assertions passed" # assert が通った } PLAY RECAP ******************************************************************************************************** localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 補足: 公式ドキュメントでは、
task_vars
で変数を変更したあとはu
(update_task
)をする手順になっているため、上記の例でもそのようにしています。ただ、今回のケース、検証環境 Ansible 2.9.6 ではupdate_task
しなくてもr
でredo
したら assert は通りました。確かにupdate_task
が必要なケースもあったのですが、詳細が思い出せずです・・。
おわりに
Playbook を書き換えずにデバッガーを有効にする方法をご紹介しました。
テスト中などの事情で、Playbook に手を入れるの憚れるときに利用できるかなと思います。
参考
docs.ansible.com tekunabe.hatenablog.jp
book.impress.co.jp
P368 7-4-4 Playbook Debugger
にデバッガーの使い方が書かれています。
教えていただきありがとうございます!
7-4 プレイブックのデバッグ
— nin (@tofuoyaco) 2020年4月21日
7-4-4 Playbook Debugger ・・・368
です!