Spec-Zone.ru › Ansible

Задачи отладки

Ansible предлагает отладчик задач, позволяющий исправлять ошибки во время выполнения вместо редактирования вашего плейбука и повторного запуска, чтобы увидеть, сработало ли ваше изменение. У вас есть доступ ко всем функциям отладчика в контексте задачи. Вы можете проверить или установить значение переменных, обновить аргументы модуля и повторно запустить задачу с новыми переменными и аргументами. Отладчик позволяет вам определить причину сбоя и продолжить выполнение плейбука.

  • Включение отладчика

    • Включение отладчика с ключевым словом debugger

      • Примеры использования ключевого слова debugger
    • Включение отладчика в конфигурации или переменной среды
    • Включение отладчика как стратегии
  • Решение ошибок в отладчике
  • Доступные команды отладки

    • Команда print
    • Команда update args
    • Команда update vars
    • Команда update task
    • Команда redo
    • Команда continue
    • Команда quit
  • Как отладчик взаимодействует со стратегией free

Включение отладчика

Отладчик по умолчанию не включён. Если вы хотите вызвать отладчик во время выполнения плейбука, вы должны сначала его включить.

Используйте один из этих трёх методов для включения отладчика:

  • с ключевым словом 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 приводит к успешному выполнению задачи.

END_OF_DOCUMENT_MARKER

Доступные команды отладки

Вы можете использовать следующие семь команд в командной строке отладки:

Команда

Сокращение

Действие

print

p

Вывести информацию о задаче

task.args[key] = value

нет сокращения

Обновить аргументы модуля

task_vars[key] = value

нет сокращения

Обновить переменные задачи (необходимо update_task)

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API