Отладчик Playbook
- Использование ключевого слова отладчика
- Конфигурация или переменная окружения
- В качестве стратегии
- Примеры
- Доступные команды
- Использование со стратегией free
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)> update_task [192.0.2.10] TASK: install package (debug)> redo
Затем задача выполняется снова с новыми task_vars.
Примечание
В версии 2.5 это было обновлено с vars до task_vars, чтобы не конфликтовать с функцией python vars().
u(pdate_task)
Введено в версии 2.8.
Эта команда повторно создает задачу из исходной структуры данных задачи и выполняет шаблоны с обновленными task_vars.
См. выше документацию для task_vars[ключ] = значение для примера использования.
r(edo)
Повторно выполнить задачу.
c(continue)
Просто продолжить.
q(uit)
Выйти из отладчика. Выполнение playbook прерывается.
Использование со стратегией free
Использование отладчика со стратегией free приведет к тому, что дальнейшие задачи не будут помещены в очередь или выполняться, пока отладчик активен. Кроме того, использование redo для задачи, чтобы запланировать ее повторное выполнение, может привести к тому, что перепланированная задача будет выполнена после последующих задач, указанных в вашем playbook.
См. также
- Работа с Playbook
- Введение в playbooks
- Список рассылки пользователей
- Есть вопрос? Загляните в группу google!
- irc.freenode.net
- #ansible IRC чат-канал
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.8/user_guide/playbooks_debugger.html