Erfassen verschiedener Arten von Ausgaben
Im vorherigen Schritt haben wir die Standardausgabe unseres Skripts erfasst und angezeigt. Bei der Ausführung von Skripten gibt es jedoch verschiedene Arten von Ausgaben, die wir möglicherweise erfassen möchten:
- Standardausgabe (stdout): Die normale Ausgabe des Skripts
- Standardfehler (stderr): Fehlermeldungen und Warnungen
- Rückgabecode (rc): Der Exit-Status des Skripts (0 bedeutet typischerweise Erfolg, Werte ungleich Null weisen auf Fehler hin)
Erstellen wir ein neues Playbook, das alle drei Arten von Ausgaben erfasst und anzeigt.
Erstellen Sie eine neue Datei mit dem Namen capture_all_output.yml im Verzeichnis ~/project/ansible-output-demo:
- Klicken Sie auf das Menü "Datei"
- Wählen Sie "Neue Datei"
- Speichern Sie sie als
capture_all_output.yml im Verzeichnis ~/project/ansible-output-demo
Fügen Sie der Datei capture_all_output.yml den folgenden Inhalt hinzu:
---
- name: Capture All Types of Script Output
hosts: local
gather_facts: no
tasks:
- name: Execute the info.sh script
command: "{{ playbook_dir }}/scripts/info.sh"
register: script_output
- name: Display standard output
debug:
msg: "Standard Output (stdout):"
- name: Display stdout content
debug:
var: script_output.stdout_lines
- name: Display standard error
debug:
msg: "Standard Error (stderr):"
- name: Display stderr content
debug:
var: script_output.stderr_lines
- name: Display return code
debug:
msg: "Return Code: {{ script_output.rc }}"
Dieses Playbook führt unser Skript aus und zeigt dann Folgendes an:
- Die Standardausgabe mit
script_output.stdout_lines
- Den Standardfehler mit
script_output.stderr_lines
- Den Rückgabecode mit
script_output.rc
Ausführen des erweiterten Playbooks
Führen wir unser neues Playbook aus:
cd ~/project/ansible-output-demo
ansible-playbook -i inventory capture_all_output.yml
Sie sollten eine umfassende Anzeige aller drei Arten von Ausgaben sehen:
PLAY [Capture All Types of Script Output] *****************************
TASK [Execute the info.sh script] *************************************
changed: [localhost]
TASK [Display standard output] ****************************************
ok: [localhost] => {
"msg": "Standard Output (stdout):"
}
TASK [Display stdout content] *****************************************
ok: [localhost] => {
"script_output.stdout_lines": [
"=== System Information ===",
"Hostname: ubuntu",
"Date: Tue Oct 17 12:40:22 UTC 2023",
"Kernel: 5.15.0-1031-aws",
"Memory:",
" total used free shared buff/cache available",
"Mem: 7.7Gi 1.2Gi 5.2Gi 12Mi 1.3Gi 6.3Gi",
"Swap: 0B 0B 0B",
"=== Standard Output ===",
"This is standard output",
"Hello from the script!"
]
}
TASK [Display standard error] *****************************************
ok: [localhost] => {
"msg": "Standard Error (stderr):"
}
TASK [Display stderr content] *****************************************
ok: [localhost] => {
"script_output.stderr_lines": [
"=== Standard Error ===",
"This is standard error",
"An example error message"
]
}
TASK [Display return code] ********************************************
ok: [localhost] => {
"msg": "Return Code: 0"
}
PLAY RECAP **********************************************************
localhost : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Jetzt können wir alle Arten von Ausgaben von unserem Skript sehen:
- Die Standardausgabe zeigt Systeminformationen und unsere regulären Nachrichten
- Der Standardfehler zeigt unsere Fehlermeldungen
- Der Rückgabecode ist 0, was auf eine erfolgreiche Ausführung hindeutet
Erstellen eines Skripts mit Fehlern
Erstellen wir ein Skript, das einen Fehler erzeugt und einen Exit-Code ungleich Null zurückgibt, um zu sehen, wie Ansible damit umgeht.
Erstellen Sie eine neue Datei mit dem Namen error.sh im Verzeichnis scripts:
- Klicken Sie auf das Menü "Datei"
- Wählen Sie "Neue Datei"
- Speichern Sie sie als
scripts/error.sh im Verzeichnis ~/project/ansible-output-demo
Fügen Sie der Datei error.sh den folgenden Inhalt hinzu:
#!/bin/bash
## Print some standard output
echo "Starting error demonstration script"
echo "This will appear in stdout"
## Print some standard error
echo "This will appear in stderr" >&2
echo "Error: Something went wrong!" >&2
## Exit with a non-zero code to indicate error
exit 1
Machen Sie das Skript ausführbar:
chmod +x ~/project/ansible-output-demo/scripts/error.sh
Erstellen wir nun ein Playbook, um dieses Skript auszuführen und den Fehler zu behandeln. Erstellen Sie eine neue Datei mit dem Namen handle_errors.yml:
- Klicken Sie auf das Menü "Datei"
- Wählen Sie "Neue Datei"
- Speichern Sie sie als
handle_errors.yml im Verzeichnis ~/project/ansible-output-demo
Fügen Sie der Datei handle_errors.yml den folgenden Inhalt hinzu:
---
- name: Handle Script Errors
hosts: local
gather_facts: no
tasks:
- name: Execute the error script
command: "{{ playbook_dir }}/scripts/error.sh"
register: script_output
ignore_errors: yes
- name: Display standard output
debug:
var: script_output.stdout_lines
- name: Display standard error
debug:
var: script_output.stderr_lines
- name: Display return code
debug:
msg: "Return Code: {{ script_output.rc }}"
- name: Check if script failed
debug:
msg: "The script failed with return code {{ script_output.rc }}"
when: script_output.rc != 0
Beachten Sie die Hinzufügung von ignore_errors: yes, die Ansible anweist, das Playbook weiterhin auszuführen, auch wenn der Befehl fehlschlägt (einen Exit-Code ungleich Null zurückgibt).
Führen wir dieses Playbook aus:
ansible-playbook -i inventory handle_errors.yml
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
PLAY [Handle Script Errors] *******************************************
TASK [Execute the error script] ***************************************
changed: [localhost]
TASK [Display standard output] ****************************************
ok: [localhost] => {
"script_output.stdout_lines": [
"Starting error demonstration script",
"This will appear in stdout"
]
}
TASK [Display standard error] *****************************************
ok: [localhost] => {
"script_output.stderr_lines": [
"This will appear in stderr",
"Error: Something went wrong!"
]
}
TASK [Display return code] ********************************************
ok: [localhost] => {
"msg": "Return Code: 1"
}
TASK [Check if script failed] *****************************************
ok: [localhost] => {
"msg": "The script failed with return code 1"
}
PLAY RECAP **********************************************************
localhost : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Dieses Beispiel zeigt, wie man:
- Ausgabe von einem Skript erfasst, das einen Fehler erzeugt
- Die Playbook-Ausführung trotz des Fehlers fortsetzt
- Aufgaben bedingt auf der Grundlage des Rückgabecodes des Skripts ausführt
Im nächsten Schritt werden wir erweiterte Anwendungsfälle und Best Practices für die Arbeit mit Skriptausgaben in Ansible untersuchen.