Як бачити складання відповідальних команд?


165

Як я бачу stdout для команд ansible-playbook? -v показує лише відповідальний вихід, а не окремі команди. Було б чудово, якби я міг зрозуміти, як це зробити негайно, тож якщо щось виходить з ладу або зависає, я можу зрозуміти, чому.

напр

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

надрукував би

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

hello


Відповіді:


165

Я думаю, ви можете зареєструвати результат на змінну, а потім надрукувати за допомогою налагодження.

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

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

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

26
Крім того, ви можете налагоджувати змінну безпосередньо за допомогою - debug: var=hello. Іноді це корисніше для багатолінійного виводу або виходу модуля Ansible (а не command/ shellвиводу).
geerlingguy

4
У мене виникли проблеми з отриманням виводу Java за допомогою цього. Виправлення полягає в тому, щоб перенаправити весь вихід Java на stdout:shell: java -version 2>&1
Маттіас Браун

20
це набагато краще нічого, але повідомлення stdout ви отримуєте лише після успішного виконання команди. У мене виникло питання, де, здавалося б, висить відповідальний. Причина полягала в тому, що я використовував неправильне ім’я користувача для команди rsync, яка опустила інтерактивний запит пароля, який просто повісив ansible. Налагоджувати було дуже важко - але якби я міг бачити stdout в режимі реального часу, я б відразу зрозумів, що я зробив не так. Я б полюбив цю функціональність, якщо це можливо.
Майкл Б

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/isissue/3887#issuecomment-54672569, в якому обговорюються причини, чому це неможливо та не буде реалізовано.


16
+1 для зв’язку помилки "вихід у реальному часі".
ntc2

Якщо я хочу надіслати out.stdout_lines (як орган завдання з відповідальною поштою), як я можу його надіслати, щоб він НЕ виглядав таким чином, коли надходить електронний лист? [u'total 61 ', u'lrwxrwxrwx 1 корінь кореня 7 лютого 15 2015 бін -> usr / bin', u'drwxr-xr-x 6 корінь кореня 1024 24 серпня 22:08 завантаження ', u' .... .]] Я хочу, щоб це виглядало так, як це видно на терміналі
Кріс Ф

фатально: [127.0.0.1]: НЕПРАВИЛО! => {"причина": "Помилка синтаксису під час завантаження YAML. \ n не знайдено очікуваного <запуск документа> \ n \ nПомилка здається в ... синтаксичній проблемі. \ n \ nПриведено, що порушується рядок: \ n \ n \ n- ім'я: запустіть ls.sh та виведіть \ "ls / \" \ n ^ тут \ 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.