Jak uzyskać dzienniki / szczegóły dotyczące wykonania modułu ansible-playbook?

96

Powiedz, że wykonuję następujące czynności.

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

Wiem na pewno, że się udało.

Gdzie / jak mogę zobaczyć echo / wydruk „Hello World” przez mój skrypt na zdalnym hoście (MyTestHost)? Albo kod powrotu / zakończenia skryptu?

Moje badania pokazują mi, że byłoby możliwe napisanie wtyczki przechwytującej wywołania zwrotne modułu lub coś w tych wierszach i zapisanie pliku dziennika. Wolałbym nie tracić na to czasu.

Np. Coś takiego jak stdout poniżej (zauważ, że uruchamiam ansibla, a nie ansible-playbook):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$
Kashyap
źródło

Odpowiedzi:

114

Jeśli przekażesz -vflagę do ansible-playbook w wierszu poleceń, zobaczysz stdout i stderr dla każdego wykonywanego zadania:

$ ansible-playbook -v playbook.yaml

Ansible ma również wbudowaną obsługę logowania. Dodaj następujące wiersze do pliku konfiguracyjnego ansible :

[defaults] 
log_path=/path/to/logfile

Ansible będzie szukał pliku konfiguracyjnego w kilku miejscach:

  • ansible.cfg w bieżącym katalogu, w którym uruchomiłeś ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg
Lorin Hochstein
źródło
8
Dzięki. Po prostu chciwy: czy mogę dynamicznie rozpoczynać / zatrzymywać logowanie z podręcznika? Jak set -xiw set +xskrypcie powłoki.
Kashyap
@thekashyap Myślę, że nie jest to obecnie możliwe.
Lorin Hochstein,
9
Możesz użyć no_log: Trueflagi, aby zapobiec rejestrowaniu polecenia lub podręcznika, ale wydaje mi się, że jest to tak drobnoziarniste, jak to tylko możliwe.
Ade Miller
4
Czy mógłbyś opisać, jak mam to zrobić, logrotateaby log_pathkażdy ansibleprzebieg miał inny plik (z poleceniem / playbookem zawartym w pliku)?
lot styropianowy
Potrzebowałem trzech vsekund, aby uzyskać stdout i stderr
bogate
24

Zadanie skryptu playbook wygeneruje się stdouttak samo jak polecenie inne niż playbook, wystarczy je zapisać w zmiennej za pomocą register. Gdy już to zrobimy, moduł debugowania może drukować do strumienia wyjściowego elementu playbook.

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

Wynik powinien wyglądać mniej więcej tak:

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}
joemaller
źródło
ale Hello sobie zadanie nie dało żadnego standardowego wyjścia
Saurabh Chandra Patel
To moja preferowana metoda. Naucz się używać wartości zarejestrowanych zmiennych w instrukcjach debugowania, a świat jest przed Tobą otworem.
Joshua K
16

Istnieje również inny sposób generowania pliku dziennika.

Przed uruchomieniem ansible-playbookuruchom następujące polecenia, aby włączyć rejestrowanie:

  • Określ lokalizację pliku dziennika.

    eksportuj ANSIBLE_LOG_PATH = ~ / ansible.log

  • Włącz debugowanie

    eksportuj ANSIBLE_DEBUG = True

  • Aby sprawdzić wygenerowany plik dziennika.

    mniej $ ANSIBLE_LOG_PATH

Kamlesh
źródło
1
ANSIBLE_DEBUG to coś innego niż określanie pliku dziennika. Jest to nawet niezależne od wyboru szczegółowości! Nadal jest to bardzo dobre do wywołania - funkcja debugowania zapewnia komunikaty debugowania zorientowane na programistów, na absolutnie ekstremalnym poziomie szczegółowości. Dobrze mieć w pobliżu.
AlanSE,
4

Oficjalne wtyczki

Możesz użyć wtyczek wywołania zwrotnego . Na przykład, zaczynając od Ansible 2.4, możesz użyć wtyczki wywołania zwrotnego wyjścia debugowania :

# In ansible.cfg:
[defaults]
stdout_callback = debug

(Alternatywnie, uruchom export ANSIBLE_STDOUT_CALLBACK=debugprzed uruchomieniem playbooka)

Ważne: należy uruchomić ansible-playbookz -v( --verboseopcja), aby zobaczyć efekt. Po stdout_callback = debugustawieniu wyjście powinno teraz wyglądać mniej więcej tak:

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

Istnieją inne moduły oprócz debugmodułu, jeśli chcesz, aby dane wyjściowe były inaczej sformatowane. Tam json, yaml, unixy, dense, minimal, itd. ( Pełna lista ).

Na przykład, z stdout_callback = yaml, wynik będzie wyglądał mniej więcej tak:

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

Wtyczki innych firm

Jeśli żadna z oficjalnych wtyczek nie jest zadowalająca, możesz wypróbować human_logwtyczkę. Istnieje kilka wersji:

Strumień
źródło
3

Korzystając z wtyczek wywołania zwrotnego, możesz mieć standardowe wyjście swoich poleceń w czytelnej formie za pomocą play: gist: human_log.py

Edytuj na przykład wyjście:

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859
J0hnG4lt
źródło
1

Pomoc wiersza polecenia Ansible, na przykład ansible-playbook --helppokazuje, jak zwiększyć szczegółowość danych wyjściowych, ustawiając tryb gadatliwości (-v) na większą szczegółowość (-vvv) lub szczegółowość debugowania połączenia (-vvvv). Powinno to dać ci niektóre szczegóły, których szukasz w stdout, które możesz następnie zarejestrować.

Zach Weg
źródło