Назад | Перейти на главную страницу

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

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

например

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

напечатал бы

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

hello

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

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

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

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

Вместо того стандартный вывод Я бы предложил использовать 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 обсуждение причин, по которым это невозможно и не будет реализовано.

Я нашел с помощью минимальный 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

Если вы действительно хотите смотреть результат в реальном времени, есть способ обойти это, по крайней мере, для ансибла. shell модуль.

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

Например, в сценарии bash, который вызывает ansible:

set -m
touch /tmp/debug.log && tail -f /tmp/debug.log &
ansible-playbook ... call playbook here
kill %1   # ensure the background tail job is stopped

Затем в какой-то недоступной роли:

- name: Run a script and print stdout/stderr
  shell: bash -c "/run/something.sh 2>&1 >> /tmp/debug.log"