てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Playbook に手を加えずにデバッガーを有効にする(ENABLE_TASK_DEBUGGER)

はじめに

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 です。

docs.ansible.com

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 しなくても rredo したら assert は通りました。確かに update_task が必要なケースもあったのですが、詳細が思い出せずです・・。


おわりに

Playbook を書き換えずにデバッガーを有効にする方法をご紹介しました。

テスト中などの事情で、Playbook に手を入れるの憚れるときに利用できるかなと思います。

参考

docs.ansible.com tekunabe.hatenablog.jp

book.impress.co.jp P368 7-4-4 Playbook Debugger にデバッガーの使い方が書かれています。

教えていただきありがとうございます!