Отладка задач
Ansible предлагает отладчик задач, чтобы вы могли исправлять ошибки во время выполнения, не редактируя плейбук и не запуская его повторно, чтобы проверить, сработало ли изменение. В контексте задачи вам доступны все функции отладчика. Вы можете проверять или задавать значения переменных, обновлять аргументы модуля и повторно запускать задачу с новыми переменными и аргументами. Отладчик позволяет устранить причину сбоя и продолжить выполнение плейбука.
Включение отладчика
По умолчанию отладчик отключен. Чтобы вызвать отладчик во время выполнения плейбука, сначала необходимо включить его.
Чтобы включить отладчик, воспользуйтесь одним из трех способов:
- с помощью ключевого слова debugger
- в конфигурации или с помощью переменной окружения либо
- в качестве стратегии
Включение отладчика с помощью ключевого слова debugger
Добавлено в версии 2.5.
С помощью ключевого слова debugger можно включить (или отключить) отладчик для определенного play, роли, блока или задачи. Этот параметр особенно полезен при разработке или расширении плейбуков, play и ролей. Отладчик можно включить для новых или обновленных задач. Если они завершатся с ошибкой, вы сможете быстро исправить ее. Ключевое слово debugger принимает пять значений:
Значение | Результат |
|---|---|
always | Всегда вызывать отладчик независимо от результата |
never | Никогда не вызывать отладчик независимо от результата |
on_failed | Вызывать отладчик, только если задача завершилась с ошибкой |
on_unreachable | Вызывать отладчик, только если узел недоступен |
on_skipped | Вызывать отладчик, только если задача пропущена |
При использовании ключевого слова debugger указанное значение переопределяет любые глобальные настройки включения или отключения отладчика. Если вы задаете debugger на нескольких уровнях, например для роли и задачи, Ansible учитывает наиболее конкретное определение. Определение на уровне play или роли применяется ко всем блокам и задачам в этом play или роли, если для них не указано другое значение. Определение на уровне блока переопределяет определение на уровне play или роли и применяется ко всем задачам в этом блоке, если для них не указано другое значение. Определение на уровне задачи всегда применяется к этой задаче и переопределяет определения на уровне блока, play или роли.
Примеры использования ключевого слова debugger
Пример задания ключевого слова debugger для задачи:
- name: Execute a command ansible.builtin.command: "false" debugger: on_failed
Пример задания ключевого слова debugger для play:
- name: My play
hosts: all
debugger: on_skipped
tasks:
- name: Execute a command
ansible.builtin.command: "true"
when: False
Пример задания ключевого слова debugger на нескольких уровнях:
- name: Play
hosts: all
debugger: never
tasks:
- name: Execute a command
ansible.builtin.command: "false"
debugger: on_failed
В этом примере для отладчика задано значение never на уровне play и on_failed на уровне задачи. Если задача завершится с ошибкой, Ansible вызовет отладчик, поскольку определение задачи переопределяет определение родительского play.
Включение отладчика в конфигурации или с помощью переменной окружения
Добавлено в версии 2.5.
Отладчик задач можно включить глобально, задав параметр в ansible.cfg или переменную окружения. Доступны только значения True и False. Если задать для параметра конфигурации или переменной окружения значение True, Ansible по умолчанию запускает отладчик для задач, завершившихся с ошибкой.
Чтобы включить отладчик задач в ansible.cfg, добавьте этот параметр в раздел [defaults]:
[defaults] enable_task_debugger = True
Чтобы включить отладчик задач с помощью переменной окружения, передайте переменную при запуске плейбука:
ANSIBLE_ENABLE_TASK_DEBUGGER=True ansible-playbook -i hosts site.yml
Если включить отладчик глобально, он будет вызываться для каждой задачи, завершившейся с ошибкой, если только роль, play, блок или задача явно не отключает отладчик. Для более точного управления условиями вызова отладчика используйте ключевое слово debugger.
Включение отладчика в качестве стратегии
При работе с устаревшими плейбуками или ролями отладчик может быть включен как стратегия. Это можно сделать на уровне play, в ansible.cfg или с помощью переменной окружения ANSIBLE_STRATEGY=debug. Например:
- hosts: test
strategy: debug
tasks:
- name: Example task
debug:
msg: "This is a debug message"
Или в ansible.cfg:
[defaults] strategy = debug
Примечание
Этот метод с обратной совместимостью, соответствующий версиям Ansible до 2.5, может быть удален в одном из будущих выпусков.
Устранение ошибок в отладчике
После вызова отладчика Ansible вы можете использовать семь команд отладчика, чтобы устранить обнаруженную Ansible ошибку. Рассмотрим пример плейбука, в котором определена переменная var1, но в задаче по ошибке используется неопределенная переменная wrong_var.
- hosts: test
debugger: on_failed
gather_facts: false
vars:
var1: value1
tasks:
- name: Use a wrong variable
ansible.builtin.ping: data={{ wrong_var }}
При запуске этого плейбука Ansible вызывает отладчик, если задача завершается с ошибкой. В приглашении отладчика можно изменить аргументы модуля или переменные и запустить задачу повторно.
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
Если в отладчике изменить аргументы задачи и использовать var1 вместо wrong_var, задача выполнится успешно.
Доступные команды отладки
В приглашении отладчика можно использовать следующие семь команд:
Команда | Сокращение | Действие |
|---|---|---|
p | Вывести информацию о задаче | |
task.args[key] = value | без сокращения | Обновить аргументы модуля |
task_vars[key] = value | без сокращения | Обновить переменные задачи (затем необходимо выполнить |
update_task | u | Пересоздать задачу с обновленными переменными задачи |
redo | r | Запустить задачу повторно |
continue | c | Продолжить выполнение со следующей задачи |
quit | q | Выйти из отладчика |
Дополнительные сведения см. в описаниях отдельных команд и примерах ниже.
Команда print
print *task/task.args/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"}
Команда обновления args
task.args[*key*] = *value* обновляет аргумент модуля. В этом примере плейбука указано недопустимое имя пакета.
- hosts: test
strategy: debug
gather_facts: true
vars:
pkg_name: not_exist
tasks:
- name: Install a package
ansible.builtin.apt: name={{ pkg_name }}
При запуске плейбука недопустимое имя пакета вызывает ошибку, и Ansible запускает отладчик. Чтобы исправить имя пакета, можно просмотреть, а затем обновить аргумент модуля.
[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
После обновления аргумента модуля используйте redo, чтобы повторно запустить задачу с новыми аргументами.
Команда обновления vars
task_vars[*key*] = *value* обновляет 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
После обновления переменных задачи необходимо использовать update_task, чтобы загрузить новые переменные, прежде чем использовать redo для повторного запуска задачи.
Примечание
В версии 2.5 название было изменено с vars на task_vars во избежание конфликтов с функцией Python vars().
Команда обновления задачи
Добавлено в версии 2.8.
u или update_task пересоздает задачу из исходной структуры данных задачи и шаблонов с обновленными переменными задачи. Пример использования см. в разделе Команда обновления vars.
Команда повторного выполнения
r или redo запускает задачу повторно.
Команда продолжения
c или continue продолжает выполнение со следующей задачи.
Команда выхода
q или quit завершает работу отладчика. Выполнение плейбука прерывается.
Взаимодействие отладчика со стратегией free
При включенной стратегии linear по умолчанию Ansible приостанавливает выполнение, пока активен отладчик, и запускает отлаживаемую задачу сразу после ввода команды redo. Однако при включенной стратегии free Ansible не ожидает завершения работы всех узлов и может поставить в очередь последующие задачи на одном узле до сбоя задачи на другом узле. При использовании стратегии free Ansible не ставит в очередь и не выполняет задачи, пока активен отладчик. Однако все поставленные в очередь задачи остаются в ней и запускаются сразу после выхода из отладчика. Если использовать redo для повторной постановки задачи в очередь из отладчика, другие задачи из очереди могут выполниться раньше повторно поставленной задачи. Дополнительные сведения о стратегиях см. в разделе Управление выполнением плейбука: стратегии и другое.
См. также
- Выполнение плейбуков для устранения неполадок
-
Запуск плейбуков во время отладки или тестирования
- Плейбуки Ansible
-
Введение в плейбуки
- Связь с сообществом
-
Есть вопросы? Нужна помощь? Хотите поделиться идеями? Посетите руководство по взаимодействию с сообществом Ansible
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_debugger.html