Показать вывод с Ansible

39

У меня есть игра Ansible для PGBouncer, которая отображает некоторый вывод из модуля статистики, встроенного в PGBouncer.

Моя проблема в том, что когда Ansible печатает вывод в терминал, он искажает переводы строки. Вместо того чтобы видеть

----------
| OUTPUT |
----------

я вижу

----------\n| OUTPUT |\n----------

Кто-нибудь знает, как заставить Ansible "красиво распечатать" вывод?

mjallday
источник

Ответы:

14

В Ansible нет способа сделать то, что вы хотите изначально. Вы можете сделать это в качестве обходного пути:

ansible-playbook ... | sed 's/\\n/\n/g'
jÄRV
источник
1
На OSX мне пришлось пользоваться sed -e 's/\\n/'$'\\\n/g'. Также актуально: comicjk.com/20
Navin
4
см. ответ Сорина на serverfault.com/a/846232/240508, который является правильным в 2017 году и может быть ответным> 2.3
Вадимо
В основном \nпоявляются в результате, так что вы можете использовать это регулярное выражение в своем сообщении отладки:msg: "{{ result.stdout | regex_replace('\\n', '\n') }}"
klml
к сожалению, при этом удаляется приятная и полезная окраска, которую вы получаете на четком выводе
Mehdi LAMRANI
63

Если вы хотите более дружественный к человеку вывод, определите:

ANSIBLE_STDOUT_CALLBACK=debug

Это заставит ansible использовать модуль вывода отладки (ранее названный human_log), несмотря на то, что его неудачное имя менее многословно и намного проще для чтения людьми.

Если вы получаете сообщение об ошибке, что этот модуль недоступен, обновите Ansible или добавьте этот модуль локально, если вы не можете обновить ansible, он будет работать с версиями ansible, такими как 2.0 или пробал, даже 1.9.

Другой вариант для настройки это добавить stdout_callback = debugв ваш ansible.cfg

Сорин
источник
13
это должен быть ПРИНЯТЫЙ ответ в 2017 году, удобный для пользователя вывод данных из коробки поставляется из коробки.
Вадимо
1
Вот еще несколько советов, чтобы сделать это более постоянным: github.com/ansible/ansible/issues/27078#issuecomment-364560173
kramer65
1
Или ANSIBLE_STDOUT_CALLBACK=yaml. Я предпочитаю это, потому что это хорошо форматирует, fail msgкогда я предоставляю объект.
Маринос Ан
13

Вы можете использовать плагин обратного вызова . Это позволит повторно проанализировать ваш вывод и легко включается и выключается.

xddsg
источник
2
Примечание: с ansible 2.0.x вам нужно наследовать от CallbackBaseимпортированного с, from ansible.plugins.callback import CallbackBaseчтобы класс обратного вызова работал.
Алло
12

Нашел этот путь на форуме группы Ansible Project:

- name: "Example test"
  command:
    ...
  register: test
- name: "Example test stdout"
  debug:
    msg: "{{ test.stdout.split('\n') }}"
- name: "Example test stderr"
  debug:
    msg: "{{ test.stderr.split('\n') }}"

Мы в основном превращаем это в список, разбивая его на новую строку, а затем распечатывая этот список.

jhutar
источник
Это делает вывод оболочки более разборчивым! Ницца!
Асфанд Кази
Это решение имеет один существенный недостаток - если не удается выполнить модуль «Пример теста», обычно происходит сбой всей сборки playbook, и вы никогда не увидите форматированный вывод, особенно тот, что для stderr, что, вероятно, наиболее интересно.
Рене
@ Рене, ты прав. Для этого вы можете добавить ignore_errors: yesк исходной команде, а затем что-то вроде `- assert: that:" test.rc == 0 ".
Джутар
0

Если вы хотите увидеть его в формате, который практически имитирует стандартный вывод, вы можете использовать debugплагин обратного вызова с debugмодулем в Ansible 2.7+ следующим образом:

- name: "Test Output"
  debug:
    msg: "{{ test_result.stdout_lines | join('\n') }}"
daveystones
источник