Отладчик Playbook
- Использование ключевого слова отладчика
- Конфигурация или переменная среды
- Как стратегия
- Примеры
- Доступные команды
- Использование со стратегией свободного выполнения
Ansible включает отладчик в составе плагинов стратегии. Этот отладчик позволяет отлаживать задачи. У вас есть доступ ко всем функциям отладчика в контексте задачи. Затем вы можете, например, проверить или установить значение переменных, обновить аргументы модуля и повторно выполнить задачу с новыми переменными и аргументами, чтобы помочь определить причину сбоя.
Есть несколько способов вызвать отладчик.
Использование ключевого слова отладчика
Новое в версии 2.5.
Ключевое слово debugger может использоваться в любом блоке, где вы предоставляете атрибут name, такой как пьеса, роль, блок или задача.
Ключевое слово debugger принимает несколько значений:
- always
- Всегда вызывать отладчик, независимо от результата
- never
- Никогда не вызывать отладчик, независимо от результата
- on_failed
- Вызывать отладчик только в случае сбоя задачи
- on_unreachable
- Вызывать отладчик только если хост недоступен
- on_skipped
- Вызывать отладчик только если задача пропущена
Эти параметры переопределяют любую глобальную конфигурацию для включения или отключения отладчика.
На задаче
- name: Execute a command command: false debugger: on_failed
На пьесе
- name: Play
hosts: all
debugger: on_skipped
tasks:
- name: Execute a command
command: true
when: False
При предоставлении на обобщенном уровне и на более конкретном уровне, более конкретный уровень имеет приоритет:
- name: Play
hosts: all
debugger: never
tasks:
- name: Execute a command
command: false
debugger: on_failed
Конфигурация или переменная среды
Новое в версии 2.5.
В ansible.cfg:
[defaults] enable_task_debugger = True
В качестве переменной среды:
ANSIBLE_ENABLE_TASK_DEBUGGER=True ansible-playbook -i hosts site.yml
При использовании этого метода любая неудачная или недоступная задача вызовет отладчик, если явно не отключена.
Как стратегия
Примечание
Это обратная совместимая методика, соответствующая версиям Ansible до 2.5, и может быть удалена в будущей версии
Чтобы использовать стратегию debug, измените атрибут strategy следующим образом:
- hosts: test strategy: debug tasks: ...
Если вы не хотите изменять код, вы можете определить переменную среды ANSIBLE_STRATEGY=debug, чтобы включить отладчик, или изменить ansible.cfg, например:
[defaults] strategy = debug
Примеры
Например, запустите playbook ниже:
- hosts: test
debugger: on_failed
gather_facts: no
vars:
var1: value1
tasks:
- name: wrong variable
ping: data={{ wrong_var }}
Отладчик вызывается, так как переменная wrong_var не определена.
Давайте изменим аргументы модуля и снова запустим задачу
PLAY ***************************************************************************
TASK [wrong variable] **********************************************************
fatal: [192.0.2.10]: FAILED! => {"failed": true, "msg": "ERROR! 'wrong_var' is undefined"}
Debugger invoked
[192.0.2.10] TASK: wrong variable (debug)> p result._result
{'failed': True,
'msg': 'The task includes an option with an undefined variable. The error '
"was: 'wrong_var' is undefined\n"
'\n'
'The error appears to have been in '
"'playbooks/debugger.yml': line 7, "
'column 7, but may\n'
'be elsewhere in the file depending on the exact syntax problem.\n'
'\n'
'The offending line appears to be:\n'
'\n'
' tasks:\n'
' - name: wrong variable\n'
' ^ here\n'}
[192.0.2.10] TASK: wrong variable (debug)> p task.args
{u'data': u'{{ wrong_var }}'}
[192.0.2.10] TASK: wrong variable (debug)> task.args['data'] = '{{ var1 }}'
[192.0.2.10] TASK: wrong variable (debug)> p task.args
{u'data': '{{ var1 }}'}
[192.0.2.10] TASK: wrong variable (debug)> redo
ok: [192.0.2.10]
PLAY RECAP *********************************************************************
192.0.2.10 : ok=1 changed=0 unreachable=0 failed=0
На этот раз задача выполняется успешно!
Доступные команды
p(print) task/task_vars/host/result
Вывести значения, используемые для выполнения модуля:
[192.0.2.10] TASK: install package (debug)> p task
TASK: install package
[192.0.2.10] TASK: install package (debug)> p task.args
{u'name': u'{{ pkg_name }}'}
[192.0.2.10] TASK: install package (debug)> p task_vars
{u'ansible_all_ipv4_addresses': [u'192.0.2.10'],
u'ansible_architecture': u'x86_64',
...
}
[192.0.2.10] TASK: install package (debug)> p task_vars['pkg_name']
u'bash'
[192.0.2.10] TASK: install package (debug)> p host
192.0.2.10
[192.0.2.10] TASK: install package (debug)> p result._result
{'_ansible_no_log': False,
'changed': False,
u'failed': True,
...
u'msg': u"No package matching 'not_exist' is available"}
task.args[ключ] = значение
Обновить аргумент модуля.
Если вы запустите playbook так:
- hosts: test
strategy: debug
gather_facts: yes
vars:
pkg_name: not_exist
tasks:
- name: install package
apt: name={{ pkg_name }}
Отладчик вызывается из-за неправильного имени пакета, поэтому давайте исправим аргументы модуля:
[192.0.2.10] TASK: install package (debug)> p task.args
{u'name': u'{{ pkg_name }}'}
[192.0.2.10] TASK: install package (debug)> task.args['name'] = 'bash'
[192.0.2.10] TASK: install package (debug)> p task.args
{u'name': 'bash'}
[192.0.2.10] TASK: install package (debug)> redo
Затем задача выполняется снова с новыми аргументами.
task_vars[ключ] = значение
Обновить task_vars.
Давайте используем тот же playbook выше, но исправим task_vars вместо аргументов:
[192.0.2.10] TASK: install package (debug)> p task_vars['pkg_name'] u'not_exist' [192.0.2.10] TASK: install package (debug)> task_vars['pkg_name'] = 'bash' [192.0.2.10] TASK: install package (debug)> p task_vars['pkg_name'] 'bash' [192.0.2.10] TASK: install package (debug)> redo
Затем задача выполняется снова с новыми task_vars.
Примечание
В версии 2.5 это было обновлено с vars на task_vars, чтобы не конфликтовать с функцией vars() языка Python.
r(edo)
Повторно выполнить задачу.
c(ontinue)
Просто продолжить.
q(uit)
Выйти из отладчика. Выполнение playbook прерывается.
Использование со стратегией свободного выполнения
Использование отладчика со стратегией free приведет к тому, что дальнейшие задачи не будут помещены в очередь или выполняться, пока отладчик активен. Кроме того, использование redo на задаче для ее повторного планирования может привести к тому, что запланированная задача будет выполнена после последующих задач, указанных в вашем playbook.
См. также
- Работа с Playbook
- Введение в playbooks
- Список рассылки пользователей
- У вас есть вопросы? Загляните в группу Google!
- irc.freenode.net
- IRC-чат канал #ansible
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.6/user_guide/playbooks_debugger.html