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