Captura de Diferentes Tipos de Salida
En el paso anterior, capturamos y mostramos la salida estándar de nuestro script. Sin embargo, al ejecutar scripts, hay varios tipos de salida que podríamos querer capturar:
- Salida Estándar (stdout): La salida normal del script
- Error Estándar (stderr): Mensajes de error y advertencias
- Código de Retorno (rc): El estado de salida del script (0 normalmente significa éxito, los valores distintos de cero indican errores)
Creemos un nuevo playbook que capture y muestre los tres tipos de salida.
Cree un nuevo archivo llamado capture_all_output.yml en el directorio ~/project/ansible-output-demo:
- Haga clic en el menú "Archivo"
- Seleccione "Nuevo archivo"
- Guárdelo como
capture_all_output.yml en el directorio ~/project/ansible-output-demo
Agregue el siguiente contenido al archivo 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 }}"
Este playbook ejecuta nuestro script y luego muestra:
- La salida estándar usando
script_output.stdout_lines
- El error estándar usando
script_output.stderr_lines
- El código de retorno usando
script_output.rc
Ejecución del Playbook Mejorado
Ejecutemos nuestro nuevo playbook:
cd ~/project/ansible-output-demo
ansible-playbook -i inventory capture_all_output.yml
Debería ver una visualización completa de los tres tipos de salida:
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
Ahora podemos ver todos los tipos de salida de nuestro script:
- La salida estándar muestra información del sistema y nuestros mensajes regulares
- El error estándar muestra nuestros mensajes de error
- El código de retorno es 0, lo que indica una ejecución exitosa
Creación de un Script con Errores
Creemos un script que producirá un error y devolverá un código de salida distinto de cero para ver cómo Ansible lo maneja.
Cree un nuevo archivo llamado error.sh en el directorio scripts:
- Haga clic en el menú "Archivo"
- Seleccione "Nuevo archivo"
- Guárdelo como
scripts/error.sh en el directorio ~/project/ansible-output-demo
Agregue el siguiente contenido al archivo 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
Haga que el script sea ejecutable:
chmod +x ~/project/ansible-output-demo/scripts/error.sh
Ahora creemos un playbook para ejecutar este script y manejar el error. Cree un nuevo archivo llamado handle_errors.yml:
- Haga clic en el menú "Archivo"
- Seleccione "Nuevo archivo"
- Guárdelo como
handle_errors.yml en el directorio ~/project/ansible-output-demo
Agregue el siguiente contenido al archivo 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
Observe la adición de ignore_errors: yes, que le dice a Ansible que continúe ejecutando el playbook incluso si el comando falla (devuelve un código de salida distinto de cero).
Ejecutemos este playbook:
ansible-playbook -i inventory handle_errors.yml
Debería ver una salida similar a la siguiente:
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
Este ejemplo demuestra cómo:
- Capturar la salida de un script que produce un error
- Continuar la ejecución del playbook a pesar del error
- Ejecutar condicionalmente tareas basadas en el código de retorno del script
En el siguiente paso, exploraremos casos de uso más avanzados y las mejores prácticas para trabajar con la salida de scripts en Ansible.