Capture de différents types de sortie
Dans l'étape précédente, nous avons capturé et affiché la sortie standard de notre script. Cependant, lors de l'exécution de scripts, il existe plusieurs types de sortie que nous pourrions vouloir capturer :
- Sortie standard (stdout) : La sortie normale du script
- Erreur standard (stderr) : Messages d'erreur et avertissements
- Code de retour (rc) : L'état de sortie du script (0 signifie généralement succès, les valeurs non nulles indiquent des erreurs)
Créons un nouveau playbook qui capture et affiche les trois types de sortie.
Créez un nouveau fichier nommé capture_all_output.yml dans le répertoire ~/project/ansible-output-demo :
- Cliquez sur le menu "File"
- Sélectionnez "New File"
- Enregistrez-le sous le nom
capture_all_output.yml dans le répertoire ~/project/ansible-output-demo
Ajoutez le contenu suivant au fichier capture_all_output.yml :
---
- 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 }}"
Ce playbook exécute notre script, puis affiche :
- La sortie standard en utilisant
script_output.stdout_lines
- L'erreur standard en utilisant
script_output.stderr_lines
- Le code de retour en utilisant
script_output.rc
Exécution du playbook amélioré
Exécutons notre nouveau playbook :
cd ~/project/ansible-output-demo
ansible-playbook -i inventory capture_all_output.yml
Vous devriez voir un affichage complet des trois types de sortie :
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
Maintenant, nous pouvons voir tous les types de sortie de notre script :
- La sortie standard affiche les informations système et nos messages réguliers
- L'erreur standard affiche nos messages d'erreur
- Le code de retour est 0, indiquant une exécution réussie
Création d'un script avec des erreurs
Créons un script qui produira une erreur et renverra un code de sortie non nul pour voir comment Ansible le gère.
Créez un nouveau fichier nommé error.sh dans le répertoire scripts :
- Cliquez sur le menu "File"
- Sélectionnez "New File"
- Enregistrez-le sous le nom
scripts/error.sh dans le répertoire ~/project/ansible-output-demo
Ajoutez le contenu suivant au fichier error.sh :
#!/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
Rendez le script exécutable :
chmod +x ~/project/ansible-output-demo/scripts/error.sh
Maintenant, créons un playbook pour exécuter ce script et gérer l'erreur. Créez un nouveau fichier nommé handle_errors.yml :
- Cliquez sur le menu "File"
- Sélectionnez "New File"
- Enregistrez-le sous le nom
handle_errors.yml dans le répertoire ~/project/ansible-output-demo
Ajoutez le contenu suivant au fichier handle_errors.yml :
---
- 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
Notez l'ajout de ignore_errors: yes qui indique à Ansible de continuer à exécuter le playbook même si la commande échoue (renvoie un code de sortie non nul).
Exécutons ce playbook :
ansible-playbook -i inventory handle_errors.yml
Vous devriez voir une sortie similaire à la suivante :
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
Cet exemple démontre comment :
- Capturer la sortie d'un script qui produit une erreur
- Continuer l'exécution du playbook malgré l'erreur
- Exécuter conditionnellement des tâches en fonction du code de retour du script
Dans l'étape suivante, nous allons explorer des cas d'utilisation plus avancés et les meilleures pratiques pour travailler avec la sortie de script dans Ansible.