wake-up-neo.net

Wie bekomme ich Protokolle/Details zu Ansible-Playbook-Modulausführungen?

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ß sicher, dass es erfolgreich war.

Wo/Wie sehe ich die "Hallo Welt", die von meinem Skript auf dem entfernten Host (MyTestHost) angezeigt/gedruckt wird? Oder der RückkehrBeendigungscode des Skripts? - /

Meine Recherche zeigt mir, dass es möglich wäre, ein Plugin zu schreiben, um Callbacks für die Modulausführung oder etwas in diesen Zeilen abzufangen und eine Protokolldatei zu schreiben. Ich würde es vorziehen, meine Zeit damit nicht zu verschwenden.

Z.B. so etwas wie das stdout unten (beachte, dass ich ansible und nicht ansible-playbook laufe):

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

$
69
Kashyap

Wenn Sie das -v-Flag 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 eine 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 verschiedenen Stellen nach der Konfigurationsdatei:

  • ansible.cfg im aktuellen Verzeichnis, in dem Sie ausgeführt wurden ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg
92
Lorin Hochstein

Die Playbook-Skriptaufgabe generiert stdout genauso wie den Befehl "Nicht-Playbook". Sie muss lediglich mit register in einer Variablen gespeichert werden. Sobald wir das haben, kann das debug Modul im Playbook-Ausgabestrom 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`."
}
17
joemaller

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

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

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

    exportieren Sie ANSIBLE_LOG_PATH = ~/ansible.log 

  • Debug aktivieren 

    export ANSIBLE_DEBUG = True 

  • So prüfen Sie die generierte Protokolldatei.

    weniger $ ANSIBLE_LOG_PATH

5
Kamlesh

Mit Hilfe von Callback-Plugins können Sie das stdout Ihrer Befehle mit dem Play in lesbarer Form ausgeben lassen: Gist: human_log.py

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
3
J0hnG4lt

Die Befehlszeilenhilfe von Ansible, z. B. ansible-playbook --help, zeigt, wie Sie die Ausführlichkeit der Ausgabe verbessern können, indem Sie den Verbose-Modus (-v) auf mehr Ausführlichkeit (-vvv) oder auf die Debugging-Ausführlichkeit (-vvvv) setzen. Dies sollte Ihnen einige der Details geben, nach denen Sie in stdout suchen, die Sie dann protokollieren können.

0
Zach Weg

Offizielle Plugins

Sie können die output callback plugins verwenden. Ab Ansible 2.4 können Sie beispielsweise das debug output Callback-Plugin verwenden:

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

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

Wichtig: Sie müssen ansible-playbook mit der Option -v (--verbose) ausführen, um den Effekt zu sehen. Wenn stdout_callback = debug gesetzt ist, sollte die Ausgabe nun etwa wie folgt 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 Modul debug gibt es noch andere Module, wenn die Ausgabe anders formatiert werden soll. Es gibt json, yaml, unixy, dense, minimal usw. ( vollständige Liste ).

Bei stdout_callback = yaml sieht die Ausgabe beispielsweise 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>

Drittanbieter-Plugins

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

0
Flux