てくなべ (tekunabe)

ansible / network automation / 学習メモ

Ansible の playbook をデバッグしたいときのあれこれ

■ debug モジュール

- debug:
    msg: "{{ var1 }}"

のようにすると var1 変数の内容が 表示されます。

公式ドキュメント

debug – Print statements during execution — Ansible Documentation


■ -v オプション

ansible-playbook コマンドの -v オプションでデバッグ的な情報が画面に表示されるようになります。 -v-vv-vvv といったように、 v の数が多いほど詳細な表示となります。


■ --step でステップ実行

playbook 中のタスクを一つ一つステップ実行していきたい場合はありませんでしょうか。 ansible-playbook コマンドに --step オプションを指定することでステップ実行ができます。

実行例

[vagrant@centos7 vagrant]$ ansible-playbook j_command.yml  --step

PLAY [172.16.0.3] *******************************************************************************************************************
Perform task: TASK: show version (N)o/(y)es/(c)ontinue: y  ← 入力待ちになるので y で続行

Perform task: TASK: show version (N)o/(y)es/(c)ontinue: *****************************************************************************

TASK [show version] *****************************************************************************************************************
ok: [172.16.0.3]
Perform task: TASK: debug result (N)o/(y)es/(c)ontinue: y  ← 入力待ちになるので y で続行

Perform task: TASK: debug result (N)o/(y)es/(c)ontinue: *****************************************************************************

TASK [debug result] *****************************************************************************************************************
ok: [172.16.0.3] => {
    "msg": {
        "changed": false,
        "failed": false,
        "stdout": [
            "Hostname: vsrx3\nModel: firefly-perimeter\nJUNOS Software Release [12.1X47-D15.4]"
        ],
        "stdout_lines": [
            [
                "Hostname: vsrx3",
                "Model: firefly-perimeter",
                "JUNOS Software Release [12.1X47-D15.4]"
            ]
        ]
    }
}

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

公式ドキュメント

Start and Step — Ansible Documentation


■ debug strategy

Ansible 2.1 から標準で利用可能になった strategy plugin です。 Playbook失敗時に、デバッガモードになり、変数の値の確認、再代入、タスクの再実行などが可能になります。 debug strategy を利用するには、playbookの最初のほうで、 strategy: debug と指定しておきます。

---
- hosts: junos
  strategy: debug   # here
  gather_facts: no
  connection: local

(2018/04/07 追記) また、Ansible 2.5 から debugger というキーワード利用することで、デバッガーを起動する条件も指定できるようになりました。 例えば、失敗時だけでなく、常にデバッガーを起動する場合は、以下のように debugger: always と指定します。

---
- hosts: junos
  debugger: always    # here
  gather_facts: no
  connection: local

(参考)  Ansible の Playbook Debugger を常に起動させる方法(Ansible 2.5 から) - てくなべ (tekunabe)

実行例

ここでは、Juniperのネットワーク機器へのパスワードが間違っていたため、ログインできずにデバッガーが起動し、 正しいパスワードを指定して、タスクの再実行をしています。

[vagrant@centos7 vagrant]$ ansible-playbook j_command.yml

PLAY [172.16.0.3] ********************************************************************************************

TASK [show version] ******************************************************************************************
fatal: [172.16.0.3]: FAILED! => {"changed": false, "failed": true, "msg": "unable to open shell. Please see: https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell"}
Debugger invoked    # ★デバッガ起動
(debug) p vars["provider"]["password"]  # ★ パスワードの確認
u'xxxxxxxxxx'
(debug) vars["provider"]["password"] = "password"  # ★ 正しいパスワードを指定
(debug) redo  # ★ タスクの再実行(成功)
ok: [172.16.0.3]

TASK [debug result] ******************************************************************************************
ok: [172.16.0.3] => {
    "msg": {
        "changed": false,
        "failed": false,
        "stdout": [
            "Hostname: vsrx3\nModel: firefly-perimeter\nJUNOS Software Release [12.1X47-D15.4]"
        ],
        "stdout_lines": [
            [
                "Hostname: vsrx3",
                "Model: firefly-perimeter",
                "JUNOS Software Release [12.1X47-D15.4]"
            ]
        ]
    }
}

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

公式ドキュメント

Playbook Debugger — Ansible Documentation


■ --syntax-check で YMAL文法チェック

playbookを実行せずに、純粋にYMALとしての文法チェックができます。

実行例(文法OK)

[vagrant@centos7 files]$ ansible-playbook j_command.yml --syntax-check

playbook: j_command.yml

実行例(文法NG)

[vagrant@centos7 files]$ ansible-playbook j_command.yml --syntax-check
ERROR! Syntax Error while loading YAML.


The error appears to have been in '/vagrant/j_command.yml': line 10, column 20, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

   - name: show version
      junos_command:
                   ^ here

exception type: <class 'yaml.scanner.ScannerError'>
exception: mapping values are not allowed here
  in "<unicode string>", line 10, column 20:
          junos_command:
                       ^

公式ドキュメント

Intro to Playbooks — Ansible Documentation