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