# Playbook Debugger

Topics

- Playbook Debugger
  - Available Commands
    - p task/vars/host/result
    - task.args[key] = value
    - vars[key] = value
    - r(edo)
    - c(ontinue)
    - q(uit)

In 2.1 we added a `debug` strategy. This strategy enables you to invoke a debugger when a task has failed. You have access to all of the features of the debugger in the context of the failed task. You can then, for example, check or set the value of variables, update module arguments, and re-run the failed task with the new variables and arguments to help resolve the cause of the failure.

To use the `debug` strategy, change the `strategy` attribute like this:

    - hosts: test
      strategy: debug
      tasks:
      ...

For example, run the playbook below:

    - hosts: test
      strategy: debug
      gather_facts: no
      vars:
        var1: value1
      tasks:
        - name: wrong variable
          ping: data={{ wrong_var }}

The debugger is invoked since the wrong_var variable is undefined.

Let’s change the module’s arguments and run the task again

    PLAY ***************************************************************************

    TASK [wrong variable] **********************************************************
    fatal: [192.0.2.10]: FAILED! => {"failed": true, "msg": "ERROR! 'wrong_var' is undefined"}
    Debugger invoked
    (debug) p result
    {'msg': u"ERROR! 'wrong_var' is undefined", 'failed': True}
    (debug) p task.args
    {u'data': u'{{ wrong_var }}'}
    (debug) task.args['data'] = '{{ var1 }}'
    (debug) p task.args
    {u'data': '{{ var1 }}'}
    (debug) redo
    ok: [192.0.2.10]

    PLAY RECAP *********************************************************************
    192.0.2.10               : ok=1    changed=0    unreachable=0    failed=0

This time, the task runs successfully!

## Available Commands

### p task/vars/host/result

Print values used to execute a module:

    (debug) p task
    TASK: install package
    (debug) p task.args
    {u'name': u'{{ pkg_name }}'}
    (debug) p vars
    {u'ansible_all_ipv4_addresses': [u'192.0.2.10'],
     u'ansible_architecture': u'x86_64',
     ...
    }
    (debug) p vars['pkg_name']
    u'bash'
    (debug) p host
    192.0.2.10
    (debug) p result
    {'_ansible_no_log': False,
     'changed': False,
     u'failed': True,
     ...
     u'msg': u"No package matching 'not_exist' is available"}

### task.args[key] = value

Update module’s argument.

If you run a playbook like this:

    - hosts: test
      strategy: debug
      gather_facts: yes
      vars:
        pkg_name: not_exist
      tasks:
        - name: install package
          apt: name={{ pkg_name }}

Debugger is invoked due to wrong package name, so let’s fix the module’s args:

    (debug) p task.args
    {u'name': u'{{ pkg_name }}'}
    (debug) task.args['name'] = 'bash'
    (debug) p task.args
    {u'name': 'bash'}
    (debug) redo

Then the task runs again with new args.

### vars[key] = value

Update vars.

Let’s use the same playbook above, but fix vars instead of args:

    (debug) p vars['pkg_name']
    u'not_exist'
    (debug) vars['pkg_name'] = 'bash'
    (debug) p vars['pkg_name']
    'bash'
    (debug) redo

Then the task runs again with new vars.

### r(edo)

Run the task again.

### c(ontinue)

Just continue.

### q(uit)

Quit from the debugger. The playbook execution is aborted.

See also

Playbooks
  An introduction to playbooks
User Mailing List
  Have a question? Stop by the google group!
irc.freenode.net
  #ansible IRC chat channel