てくなべ (tekunabe)

ansible / network automation / 学習メモ

Ansible の Playbook Debugger を常に起動させる方法(Ansible 2.5 から)

■ はじめに

Ansible には Playbook Debugger というPlaybook の実行を途中で止めて、変数の内容を表紙したり変更したりできる機能があります。 これまでは、エラー発生時のみ Debugger を起動させることできたのですが、次期バージョン Ansible 2.5 から、オプションの指定次第で常に Debugger を起動させることができるようになります。

本記事では、Playbookの書き方と動作イメージについてご紹介します。

なお、ansible-playbook コマンドの --step オプションとは別のものです。


■ 環境

インストール

記事執筆時点では 2.5 は beta2 となっています。 ここでは pip で以下のようにインストールします。

pip install git+https://github.com/ansible/ansible.git@stable-2.5

バージョン確認

バージョンが 2.5系 になっていることを確認します。

(ansible25) [vagrant@centos7 vagrant]$ ansible-playbook --version
ansible-playbook 2.5.0b2
  config file = /etc/ansible/ansible.cfg
  (略)


■ お試し

Playbook

以下のような Playbook で試します。 ポイントは以下の2箇所です。

  • strategy: debug 今までも利用できた Playbook Debugger を適用するための指定です
  • debugger: always 2.5 から利用可能な、Debugger を起動させる条件の指定です。alyways で常に起動。
- hosts: junos
  gather_facts: no
  strategy: debug      # point1
  debugger: always     # point2

  tasks:
    - name: task1
      junos_facts:

    - name: task2
      junos_command:
        commands:
          - show version

(インベントリファイル、varsファイルは省略します)

実行結果

(1) 通常通り ansible-playbook コマンドで実行します。

(ansible25) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory test.yml

PLAY [junos] ****************************************************************

TASK [task1] ****************************************************************
ok: [172.16.0.1]
[172.16.0.1] TASK: task1 (debug)>

このように Debugger が起動し、入力待ち状態になります。

(2) h でヘルプを表示します。

[172.16.0.1] TASK: task1 (debug)> h

Documented commands (type help <topic>):
========================================
EOF  c  continue  h  help  p  pprint  q  quit  r  redo

[172.16.0.1] TASK: task1 (debug)>

このように 入力オプションが表示されます。

(3) c で処理を続けます。

[172.16.0.1] TASK: task1 (debug)> c

TASK [task2] *****************************************************************
ok: [172.16.0.1]
[172.16.0.1] TASK: task2 (debug)>

このように、 task2 が実行され、入力待ち状態になります。

(4) p でタスク実行結果の内容を表示させます。

[172.16.0.1] TASK: task2 (debug)> p result._result
{'_ansible_no_log': False,
 '_ansible_parsed': True,
 u'changed': False,
 'failed': False,
 u'invocation': {u'module_args': {u'commands': [u'show version'],
                                  u'display': None,
                                  u'host': None,
                                  u'interval': 1,
                                  u'match': u'all',
                                  u'password': None,
                                  u'port': None,
                                  u'provider': None,
                                  u'retries': 10,
                                  u'rpcs': None,
                                  u'ssh_keyfile': None,
                                  u'timeout': None,
                                  u'transport': None,
                                  u'username': None,
                                  u'wait_for': None}},
 u'stdout': [u'Hostname: vsrx1\nModel: firefly-perimeter\nJUNOS Software Release [12.1X47-D15.4]'],
 u'stdout_lines': [[u'Hostname: vsrx1',
                    u'Model: firefly-perimeter',
                    u'JUNOS Software Release [12.1X47-D15.4]']]}
[172.16.0.1] TASK: task2 (debug)> 

このように、p result._result で、タスク実行結果の各変数が表示されます。 Playbook の中で特に register で明示的に変数に代入していないのもポイントです。 その他、Playbook Debbuger の詳細は使用方法は、公式ドキュメントの「Playbook Debugger」ページをご参照ください。

(5) c で処理を続けます。

[172.16.0.1] TASK: task2 (debug)> c

PLAY RECAP *******************************************************************
172.16.0.1                 : ok=2    changed=0    unreachable=0    failed=0

(ansible25) [vagrant@centos7 vagrant]$

すべてのタスクが終了します。

デモ動画

先ほどの実行結果の動画版です。

f:id:akira6592:20180220180655g:plain


■ まとめ

エラー時だけでなく、通常時も Debbuger を起動できるようになり、Playbook の開発、デバッグが捗りそうです。

・参考記事

tekunabe.hatenablog.jp