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