Wyświetl wyjście z Ansible


38

Mam funkcję Ansible play dla PGBouncer, która wyświetla dane wyjściowe z modułu statystyk wbudowanego w PGBouncer.

Mój problem polega na tym, że kiedy Ansible drukuje dane wyjściowe do terminala, zmienia znaki nowej linii. Zamiast widzieć

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

Widzę

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

Czy ktoś wie, jak uzyskać odpowiedź na „ładny wydruk” wydruku?

Odpowiedzi:


14

W Ansible nie ma sposobu na robienie tego, co chcesz. Możesz to zrobić jako obejście:

ansible-playbook ... | sed 's/\\n/\n/g'

1
Na OSX musiałem użyć sed -e 's/\\n/'$'\\\n/g'. Również istotne: comicjk.com/20
Navin

4
patrz: odpowiedź sorins serverfault.com/a/846232/240508, która jest poprawna w 2017 roku i odpowiada> 2.3
Vadimo,

Najczęściej \npojawiają się w wyniku, więc możesz użyć tego msg: "{{ result.stdout | regex_replace('\\n', '\n') }}"
wyrażenia regularnego w

62

Jeśli chcesz uzyskać wynik bardziej przyjazny dla człowieka, zdefiniuj:

ANSIBLE_STDOUT_CALLBACK=debug

Ułatwi to korzystanie z modułu wyjściowego debugowania (poprzednio nazwanego human_log), który pomimo swojej niefortunnej nazwy jest mniej gadatliwy i znacznie łatwiejszy do odczytania przez ludzi.

Jeśli pojawi się błąd, że ten moduł nie jest dostępny, zaktualizuj Ansible lub dodaj ten moduł lokalnie, jeśli nie możesz zaktualizować ansible, będzie działał z wersjami ansible takimi jak 2.0 lub prawdopodobnie nawet 1.9.

Inną opcją konfiguracji jest dodanie stdout_callback = debugdo pliku ansible.cfg


13
taka powinna być AKCEPTOWANA odpowiedź w 2017 r. przyjazny dla człowieka wyjściowy dziennik jest wysyłany z pudełka.
Vadimo,

1
Oto kilka wskazówek, które uczynią to bardziej trwałym: github.com/ansible/ansible/issues/27078#issuecomment-364560173
kramer65 10.04.18

1
Lub ANSIBLE_STDOUT_CALLBACK=yaml. Wolę, ponieważ ładnie formatuje, fail msggdy udostępniam obiekt.
Marinos An

13

Możesz użyć wtyczki oddzwaniania . Spowoduje to ponowne przeanalizowanie danych wyjściowych i można je łatwo włączać i wyłączać.


2
Uwaga: W ansible 2.0.x musisz odziedziczyć po CallbackBasezaimportowanym, from ansible.plugins.callback import CallbackBaseaby klasa callback działała.
allo

12

Znalezione w ten sposób na forum grupy 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') }}"

Zasadniczo przekształcamy to w listę, dzieląc ją na nową linię, a następnie drukując tę ​​listę.


Dzięki temu wyjście z powłoki jest znacznie bardziej czytelne! Miły!
Asfand Qazi

Wydaje się, że to rozwiązanie ma jedną poważną wadę - jeśli wykonanie modułu „Przykładowy test” nie powiedzie się, zwykle kończy się kompilacja playbooka i nigdy nie zobaczysz sformatowanego wyjścia, szczególnie dla stderr, co jest prawdopodobnie najbardziej interesujące.
René,

@ René masz rację. W tym celu możesz dodać ignore_errors: yesdo oryginalnej komendy, a później coś takiego jak `- assert: that:" test.rc == 0 ".
jhutar


0

Jeśli chcesz zobaczyć go w formacie, który praktycznie naśladuje standardowe wyjście, możesz użyć debugwtyczki zwrotnej z debugmodułem w Ansible 2.7+ w następujący sposób:

- name: "Test Output"
  debug:
    msg: "{{ test_result.stdout_lines | join('\n') }}"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.