Как увидеть стандартный вывод команды?

165

Как посмотреть стандартный вывод для команд ansible-playbook? -v показывает только отчетливый вывод, а не отдельные команды. Было бы здорово, если бы я мог понять, как это сделать немедленно, поэтому, если что-то не получается или зависает, я понимаю, почему.

например

- name: print to stdout
  action: command echo "hello"

будет печатать

TASK: [print variable] ******************************************************** 

hello
QuinnBaetz
источник

Ответы:

165

Я думаю, что вы можете зарегистрировать результат в переменной, а затем распечатать с отладкой.

- name: print to stdout
  command: echo "hello"
  register: hello

- debug: msg="{{ hello.stdout }}"

- debug: msg="{{ hello.stderr }}"
bfschott
источник
26
Кроме того, вы можете отладить переменную напрямую - debug: var=hello. Иногда это более полезно для многострочного вывода или вывода модуля Ansible (а не для command/ shelloutput).
geerlingguy
4
У меня были проблемы с получением вывода Java с использованием этого. Исправление состоит в том, чтобы перенаправить весь вывод Java на стандартный вывод:shell: java -version 2>&1
Матиас Браун
20
ничего лучше, но вы получите сообщение stdout только после успешного завершения команды. У меня была проблема, из-за которой ANSIBLE, казалось бы, зависал. Причина заключалась в том, что я использовал неправильное имя пользователя для команды rsync, которая помещала в очередь интерактивный запрос пароля, который просто повесил ansible. Отладку было очень сложно - но если бы я мог видеть стандартный вывод в реальном времени, я бы сразу понял, что сделал неправильно. Я бы полюбил эту функциональность, если это возможно.
Майкл Б
10
хотя это работает, это означает, что ansible делает отладку очень сложной. Давайте представим, что первая задача никогда не заканчивается (возможно, она глупо ждет ввода пользователя) ... пользователь никогда не узнает! Более того, registerмодуль или что бы то ни было не производит объекты с установленной переменной stdoutили stderr.... так что очень плохо, что мы не просто получаем вывод по умолчанию: |
vlad-ardelean
96

Вместо stdout я бы предложил использовать stdout_lines . Для многострочного вывода это намного лучше, например

- hosts: all
  tasks:
    - name: Run ls.sh and output "ls /"
      script: ls.sh
      register: out

    - debug: var=out.stdout_lines

дает

TASK: [debug var=out.stdout_lines] ******************************************** 
ok: [local] => {
    "var": {
        "out.stdout_lines": [
            "total 61", 
            "lrwxrwxrwx   1 root root     7 Feb 15  2015 bin -> usr/bin", 
            "drwxr-xr-x   6 root root  1024 Aug 24 22:08 boot", 
            "drwxr-xr-x  22 root root  3580 Sep  8 18:41 dev",  
            [...] 
            "drwxr-xr-x   9 root root  4096 Aug 25 19:14 usr", 
            "drwxr-xr-x  13 root root  4096 Feb 25  2015 var"
        ]
    }
}

Что касается вывода в реальном времени для целей отладки, то здесь есть закрытый отчет об ошибках https://github.com/ansible/ansible/issues/3887#issuecomment-54672569, в котором обсуждаются причины, по которым это невозможно и не будет реализовано.

Марс
источник
16
+1 за привязку к ошибке «Вывод в реальном времени».
ntc2
Если я хочу отправить out.stdout_lines (как тело почтовой задачи Ansible), как я могу отправить его, чтобы он НЕ выглядел так, как получено по электронной почте? [u'total 61 ', u'lrwxrwxrwx 1 корневой корень 7 февраля 15 2015 bin -> usr / bin', u'drwxr-xr-x 6 корневой корень 1024 24 августа 22:08 boot ', u' .... . '] Я хочу, чтобы это выглядело так, как видно на терминале
Крис Ф
фатальный: [127.0.0.1]: СБОЙ! => {"причина": "Синтаксическая ошибка при загрузке YAML. \ n не найден ожидаемый <начало документа> \ n \ nОшибка, по-видимому, связана с ... синтаксической проблемой. \ n \ nОтличная строка: \ n \ n \ n- name: запустите ls.sh и выведите \ "ls / \" \ n ^ here \ n "}
конец
20

Я обнаружил, что использование минимального stdout_callback с ansible-playbook дало результат, аналогичный использованию ad-hoc ansible.

В вашем ansible.cfg (обратите внимание, что я на OS X, поэтому измените callback_pluginsпуть в соответствии с вашей установкой)

stdout_callback     = minimal
callback_plugins    = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback

Так что такая задача, как эта

---
- hosts: example
  tasks:
   - name: Say hi
     command: echo "hi ..."

Дает вывод, как это, как бы специальная команда

example | SUCCESS | rc=0 >>
hi ...

Я использую ansible-playbook 2.2.1.0

Джейсон С
источник
Хороший плагин обратного вызова, простая пост-обработка может извлечь только стандартный вывод.
RichVel