Wie erhalte ich Protokolle / Details zu Ausführungen von Ansible-Playbook-Modulen?

95

Angenommen, ich führe Folgendes aus.

$ 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

$

Ich weiß mit Sicherheit, dass es erfolgreich war.

Wo / wie sehe ich die "Hallo Welt", die von meinem Skript auf dem Remote-Host (MyTestHost) wiedergegeben / gedruckt wird? Oder der Rückkehr- / Exit-Code des Skripts?

Meine Forschung zeigt mir, dass es möglich wäre, ein Plugin zu schreiben, um Rückrufe zur Modulausführung oder ähnliches in diesen Zeilen abzufangen und eine Protokolldatei zu schreiben. Ich würde es vorziehen, meine Zeit nicht damit zu verschwenden.

ZB so etwas wie das Standard unten (beachte, dass ich ansible und nicht ansible-playbook laufen lasse):

$ 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
quelle

Antworten:

113

Wenn Sie das -vFlag in der Befehlszeile an ansible-playbook übergeben, werden für jede ausgeführte Aufgabe stdout und stderr angezeigt:

$ ansible-playbook -v playbook.yaml

Ansible bietet auch integrierte Unterstützung für die Protokollierung. Fügen Sie Ihrer ansible-Konfigurationsdatei die folgenden Zeilen hinzu :

[defaults] 
log_path=/path/to/logfile

Ansible sucht an mehreren Stellen nach der Konfigurationsdatei:

  • ansible.cfg in dem aktuellen Verzeichnis, in dem Sie ausgeführt haben ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg
Lorin Hochstein
quelle
8
Vielen Dank. Nur gierig: Kann ich die Protokollierung von einem Playbook aus dynamisch starten / stoppen? Wie set -xund set +xin einem Shell-Skript.
Kashyap
@thekashyap Ich denke nicht, dass dies derzeit möglich ist.
Lorin Hochstein
9
Sie können das no_log: TrueFlag verwenden, um zu verhindern, dass ein Befehl oder ein Playbook protokolliert wird, aber das ist meiner Meinung nach so feinkörnig wie es nur geht.
Ade Miller
4
Könnten Sie bitte beschreiben, wie ich vorgehen soll logrotate, log_pathdamit jeder ansibleLauf eine andere Datei enthält (mit dem in der Datei enthaltenen Befehl / Playbook)?
Styropor fliegen
Ich brauchte drei vSekunden, um stdout und stderr
reich zu werden
24

Die Playbook-Skriptaufgabe wird stdoutgenau wie der Nicht-Playbook-Befehl generiert. Sie muss nur mit in einer Variablen gespeichert werden register. Sobald wir das haben, kann das Debug-Modul in den Playbook-Ausgabestream drucken.

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 }}`."

Die Ausgabe sollte ungefähr so ​​aussehen:

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
quelle
aber Hallo selbst Aufgabe haben keine stdout gegeben
Saurabh Chandra Patel
Dies ist meine bevorzugte Methode. Machen Sie sich gut mit den Werten registrierter Variablen in Debug-Anweisungen und die Welt ist Ihre Auster.
Joshua K
14

Es gibt auch eine andere Möglichkeit, eine Protokolldatei zu generieren.

Führen Sie vor dem ansible-playbookAusführen die folgenden Befehle aus, um die Protokollierung zu aktivieren:

  • Geben Sie den Speicherort für die Protokolldatei an.

    export ANSIBLE_LOG_PATH = ~ / ansible.log

  • Debug aktivieren

    export ANSIBLE_DEBUG = True

  • So überprüfen Sie die generierte Protokolldatei.

    weniger $ ANSIBLE_LOG_PATH

Kamlesh
quelle
1
ANSIBLE_DEBUG unterscheidet sich von der Angabe einer Protokolldatei. Es ist sogar von der Ausführlichkeitsauswahl getrennt! Dies ist immer noch sehr gut zu nennen - Debug gibt Ihnen entwicklerorientierte Debug-Meldungen auf absolut extremer Ausführlichkeitsstufe. Gut zu haben.
AlanSE
4

Offizielle Plugins

Sie können die Output Callback Plugins verwenden . Ab Ansible 2.4 können Sie beispielsweise das Debug- Ausgabe-Callback-Plugin verwenden:

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

(Alternativ können Sie es ausführen, export ANSIBLE_STDOUT_CALLBACK=debugbevor Sie Ihr Playbook ausführen. )

Wichtig: Sie müssen ansible-playbookmit der Option -v( --verbose) ausgeführt werden, um den Effekt zu sehen. Mit stdout_callback = debugset sollte die Ausgabe nun ungefähr so ​​aussehen:

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

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

Neben dem debugModul gibt es noch andere Module, wenn die Ausgabe anders formatiert werden soll. Es gibt json, yaml, unixy, dense, minimalusw. ( vollständige Liste ).

Mit stdout_callback = yamlsieht die Ausgabe beispielsweise ungefähr so ​​aus:

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>

Plugins von Drittanbietern

Wenn keines der offiziellen Plugins zufriedenstellend ist, können Sie das human_logPlugin ausprobieren . Es gibt einige Versionen:

Fluss
quelle
3

Mithilfe von Rückruf-Plugins können Sie die Standardausgabe Ihrer Befehle in lesbarer Form mit play: gist: human_log.py ausgeben

Bearbeiten Sie zum Beispiel die Ausgabe:

 _____________________________________
< 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
quelle
1

Ansible Befehlszeilenhilfe, z. B. ansible-playbook --helpzeigt, wie die Ausführlichkeit der Ausgabe erhöht wird, indem der ausführliche Modus (-v) auf mehr Ausführlichkeit (-vvv) oder die Ausführlichkeit beim Debuggen von Verbindungen (-vvvv) eingestellt wird. Dies sollte Ihnen einige der Details geben, nach denen Sie in stdout suchen, die Sie dann protokollieren können.

Zach Weg
quelle