Spec-Zone.ru › Ansible

Отладка задач

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

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

    • Включение отладчика с помощью ключевого слова debugger

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

    • Команда print
    • Команда обновления args
    • Команда обновления vars
    • Команда обновления задачи
    • Команда повторного выполнения
    • Команда продолжения
    • Команда выхода
  • Взаимодействие отладчика со стратегией free

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

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

Чтобы включить отладчик, воспользуйтесь одним из трех способов:

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

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

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

Команда

Сокращение

Действие

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"}

Команда обновления 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

Spec-Zone.ru

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