Fortgeschrittene Techniken zur Ausgabeverarbeitung
Nachdem wir die Grundlagen der Erfassung der Skriptausgabe verstanden haben, wollen wir einige fortgeschrittenere Techniken zur Verarbeitung und Anzeige der Ausgabe in Ansible Playbooks untersuchen.
Umgang mit Skriptfehlern
Beim Ausführen von Skripten ist es wichtig, Fehlerbedingungen richtig zu behandeln. Ansible markiert eine Aufgabe als fehlgeschlagen, wenn der Befehl einen Wert ungleich Null als Exit-Code zurückgibt. Erstellen wir ein Playbook, das die Fehlerbehandlung demonstriert.
Erstellen Sie eine Datei namens error_handling.yml
in Ihrem Verzeichnis ~/project/ansible-lab
:
---
- name: Handling Script Errors
hosts: localhost
gather_facts: no
tasks:
- name: Run a command that might fail
command: ls /nonexistent_directory
register: cmd_result
ignore_errors: yes
- name: Show error message if command failed
debug:
msg: "Command failed with error: {{ cmd_result.stderr }}"
when: cmd_result.rc != 0
- name: Show success message if command succeeded
debug:
msg: "Command succeeded with output: {{ cmd_result.stdout }}"
when: cmd_result.rc == 0
In diesem Playbook:
- Wir versuchen, ein Verzeichnis aufzulisten, das nicht existiert
- Wir verwenden
ignore_errors: yes
, um zu verhindern, dass das Playbook anhält, wenn der Befehl fehlschlägt
- Wir überprüfen den Rückgabecode (
cmd_result.rc
), um festzustellen, ob der Befehl erfolgreich war oder fehlgeschlagen ist
- Wir zeigen entsprechende Meldungen basierend auf dem Ergebnis an
Lassen Sie uns dieses Playbook ausführen:
cd ~/project/ansible-lab
ansible-playbook -i inventory.ini error_handling.yml
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
PLAY [Handling Script Errors] ***********************************************************
TASK [Run a command that might fail] ***************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["ls", "/nonexistent_directory"], "delta": "0:00:00.003398", "end": "2023-09-15 12:34:56.789012", "msg": "non-zero return code", "rc": 2, "start": "2023-09-15 12:34:56.785614", "stderr": "ls: cannot access '/nonexistent_directory': No such file or directory", "stderr_lines": ["ls: cannot access '/nonexistent_directory': No such file or directory"], "stdout": "", "stdout_lines": []}
...ignoring
TASK [Show error message if command failed] *********************************************
ok: [localhost] => {
"msg": "Command failed with error: ls: cannot access '/nonexistent_directory': No such file or directory"
}
TASK [Show success message if command succeeded] ****************************************
skipping: [localhost]
PLAY RECAP *******************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=1
Beachten Sie, dass das Playbook trotz des Fehlschlagens des Befehls weiterläuft und die Fehlermeldung anzeigt.
Erstellen wir ein komplexeres Skript, das mehrzeilige Ausgabe generiert, und formatieren wir es dann in unserem Playbook ansprechend.
Erstellen Sie eine Datei namens package_info.sh
in Ihrem Verzeichnis ~/project/ansible-lab
:
#!/bin/bash
echo "TOP 5 LARGEST INSTALLED PACKAGES"
echo "================================"
dpkg-query -W -f='${Installed-Size}\t${Package}\n' | sort -n -r | head -5
Machen Sie es ausführbar:
chmod +x ~/project/ansible-lab/package_info.sh
Erstellen Sie nun ein Playbook, um dieses Skript auszuführen und die Ausgabe ansprechend zu formatieren. Erstellen Sie eine Datei namens formatted_output.yml
:
---
- name: Format Script Output
hosts: localhost
gather_facts: no
tasks:
- name: Run package info script
shell: ./package_info.sh
register: pkg_info
- name: Display raw output
debug:
msg: "{{ pkg_info.stdout }}"
- name: Display formatted output with a title
debug:
msg: |
Below is the package information:
--------------------------------
{% for line in pkg_info.stdout_lines %}
{{ line }}
{% endfor %}
--------------------------------
Total lines: {{ pkg_info.stdout_lines | length }}
Dieses Playbook:
- Führt unser Skript
package_info.sh
aus
- Zeigt die Rohausgabe an
- Verwendet eine Jinja2-Vorlage, um die Ausgabe mit einem Titel und einer Fußzeile zu formatieren
Lassen Sie uns es ausführen:
ansible-playbook -i inventory.ini formatted_output.yml
Sie sollten eine ansprechend formatierte Ausgabe sehen:
PLAY [Format Script Output] ***********************************************************
TASK [Run package info script] ********************************************************
changed: [localhost]
TASK [Display raw output] *************************************************************
ok: [localhost] => {
"msg": "TOP 5 LARGEST INSTALLED PACKAGES\n================================\n112233\tsome-large-package\n99887\tanother-package\n...\n"
}
TASK [Display formatted output with a title] ******************************************
ok: [localhost] => {
"msg": "Below is the package information:\n--------------------------------\nTOP 5 LARGEST INSTALLED PACKAGES\n================================\n112233\tsome-large-package\n99887\tanother-package\n...\n--------------------------------\nTotal lines: 7"
}
PLAY RECAP ****************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Bedingtes Anzeigen der Ausgabe
Manchmal möchten Sie die Ausgabe nur unter bestimmten Bedingungen anzeigen, z. B. im ausführlichen Modus. Sehen wir uns an, wie das geht.
Erstellen Sie eine Datei namens conditional_output.yml
in Ihrem Verzeichnis ~/project/ansible-lab
:
---
- name: Conditional Output Display
hosts: localhost
gather_facts: yes
tasks:
- name: Get disk usage information
shell: df -h
register: disk_info
- name: Display disk usage (always shown)
debug:
msg: "{{ disk_info.stdout_lines[0:2] }}"
- name: Display detailed disk usage (only in verbose mode)
debug:
msg: "{{ disk_info.stdout_lines }}"
verbosity: 1
In diesem Playbook:
- Wir erfassen Informationen zur Festplattennutzung
- Wir zeigen immer eine Zusammenfassung an (die ersten beiden Zeilen)
- Wir zeigen die vollständigen Details nur im ausführlichen Modus an (mit dem Flag
-v
)
Führen wir es zuerst im normalen Modus aus:
ansible-playbook -i inventory.ini conditional_output.yml
Führen wir es nun im ausführlichen Modus aus:
ansible-playbook -i inventory.ini conditional_output.yml -v
Sie werden feststellen, dass Sie im ausführlichen Modus die vollständigen Informationen zur Festplattennutzung erhalten, während Sie im normalen Modus nur die Zusammenfassung sehen.
Diese Technik ist nützlich, um potenziell sensible oder überwältigende Ausgaben standardmäßig auszublenden und sie dennoch bei Bedarf zur Fehlerbehebung verfügbar zu machen.