Jak zobaczyć standardowe polecenia ansible?

165

Jak wyświetlić stdout dla komend ansible-playbook? -v wyświetla tylko wyjściowe odpowiedzi, a nie poszczególne polecenia. Byłoby wspaniale, gdybym mógł wymyślić, jak to zrobić natychmiast, więc jeśli coś zawiedzie lub zawiesi się, zobaczę, dlaczego.

na przykład

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

wydrukuje

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

hello
QuinnBaetz
źródło

Odpowiedzi:

164

Myślę, że możesz zarejestrować wynik w zmiennej, a następnie wydrukować za pomocą debugowania.

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

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

- debug: msg="{{ hello.stderr }}"
Bfschott
źródło
26
Dodatkowo możesz debugować zmienną bezpośrednio za pomocą - debug: var=hello. Czasami jest to bardziej pomocne w przypadku wyjścia wielowierszowego lub wyjścia modułu Ansible (zamiast command/ shelloutput).
geerlingguy
4
Miałem problem z uzyskaniem danych wyjściowych Java za pomocą tego. Rozwiązaniem jest przekierowanie wszystkich danych wyjściowych Javy na standardowe wyjście:shell: java -version 2>&1
Matthias Braun
20
to o wiele lepsze nic, ale wiadomość stdout pojawia się dopiero po pomyślnym zakończeniu polecenia. Miałem problem z zawieszaniem się ansibla. Powodem było to, że użyłem niewłaściwej nazwy użytkownika dla polecenia rsync, które buforowało żądanie interaktywnego hasła, które właśnie zawiesiło odpowiedź. Bardzo trudno było debugować - ale gdybym mógł zobaczyć standardowe wyjście w czasie rzeczywistym, natychmiast zdałbym sobie sprawę, co zrobiłem źle. Chciałbym KOCHAĆ tę funkcjonalność, jeśli to możliwe.
Michael B,
10
chociaż to działa, oznacza to, że ansible sprawia, że ​​debugowanie jest naprawdę trudne. Wyobraźmy sobie, że pierwsze zadanie nigdy się nie kończy (być może głupio czeka na wejście użytkownika) ... użytkownik nigdy się nie dowie! Co więcej, registermoduł, czy cokolwiek to jest, nie produkuje obiektów, które mają ustawioną zmienną stdoutlub stderr... .... więc naprawdę źle, że domyślnie nie otrzymujemy danych wyjściowych: |
vlad-ardelean
95

Zamiast stdout sugerowałbym użycie stdout_lines . W przypadku produkcji wieloliniowej jest to o wiele ładniejsze, np

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

    - debug: var=out.stdout_lines

daje

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"
        ]
    }
}

Jeśli chodzi o dane wyjściowe w czasie rzeczywistym do celów debugowania, jest zamknięty raport o błędach https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 omawiający przyczyny, dla których nie jest to możliwe i nie zostanie zaimplementowane.

Mars
źródło
16
+1 za połączenie błędu „wyjścia w czasie rzeczywistym”.
ntc2
Jeśli chcę wysłać out.stdout_lines (jako część zadania poczty Ansible), jak mogę je wysłać, aby NIE wyglądało tak po otrzymaniu wiadomości e-mail? [u'total 61 ', u'lrwxrwxrwx 1 root root 7 lutego 15 2015 bin -> usr / bin', u'drwxr-xr-x 6 root root 1024 sierpnia 24 22:08 boot ', u' .... . '] Chcę, aby wyglądało to tak, jak widać na terminalu
Chris F
fatal: [127.0.0.1]: FAILED! => {"powód": "Błąd składni podczas ładowania YAML. \ n nie znaleziono oczekiwanego <początek dokumentu> \ n \ n Błąd wydaje się mieć ... problem ze składnią. \ n \ n Linia obrażająca wygląda następująco: \ n \ n \ n- nazwa: Uruchom ls.sh i wyjdź \ "ls / \" \ n ^ tutaj \ n "}
Nate
20

Zauważyłem, że użycie minimum stdout_callback z playbookiem ansible dało podobny efekt jak użycie ad-hoc ansible.

W pliku ansible.cfg (pamiętaj, że korzystam z systemu OS X, więc zmień callback_pluginsścieżkę w celu dopasowania do instalacji)

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

Więc takie zadanie jak to

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

Daje takie dane wyjściowe, jak w przypadku polecenia ad-hoc

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

Używam ansible-playbook 2.2.1.0

Jason S.
źródło
Ładna wtyczka zwrotna, proste przetwarzanie końcowe może wyodrębnić tylko standardowe wyjście.
RichVel