📜 Changelog — shflow.sh
Este documento registra los cambios realizados en el ejecutor principal de ShFlow (shflow.sh), encargado de interpretar playbooks YAML y ejecutar módulos sobre hosts remotos.
This document records changes made to ShFlow’s main runner (shflow.sh), responsible for interpreting YAML playbooks and executing modules across remote hosts.
🇪🇸 Historial de versiones
🧩 Versión 1.5.4 — 2025-09-30
✨ Nuevas funcionalidades
- Se añade soporte para cargar variables globales desde
core/inventory/vars/all.yaml, accesibles comoshflow_vars. - Las variables globales pueden ser sobrescritas por
vars:en el playbook, respetando la jerarquía declarativa. - Se permite heredar
become: truedesdeall.yamlsi no está definido en la tarea, permitiendo escalado automático consudo.
🧪 Ejemplo reproducible
# all.yaml
become: true
# playbook.yaml
tasks:
- name: Actualizar sistema completo
module: package
args:
state: system-update📦 Cambios internos
- Se carga
all.yamlantes quevars:del playbook, permitiendo sobrescritura. - Se añade lógica defensiva para incluir
becomeenARG_VALUESsi no está enargs. - Se refuerza la compatibilidad con módulos que usan
args[become].
🧁 Compatibilidad
- Compatible con playbooks existentes.
- Compatible con módulos que ya usan
become. - Compatible con entornos multiusuario y SSH remoto.
📁 Archivos modificados
shflow.sh
🧩 Versión 1.5.3 — 2025-09-30
✨ Nuevas funcionalidades
- Se añade soporte para
remote_usercomo clave declarativa envars, permitiendo conectar por SSH como otro usuario. - Se mantiene compatibilidad con
become: true, permitiendo escalar privilegios víasudodesde el usuario remoto. - Se implementa lógica combinada para los cuatro casos posibles: con/sin
remote_usery con/sinbecome. - Se añade traza visual del usuario SSH (
👤 Usuario SSH: ...) en cada ejecución por host.
🖼️ Mejora visual
- Se introduce banner superior con fondo blanco y letras azul oscuro, mostrando la versión de ShFlow (
🌀 ShFlow version: 1.5.3). - Se añade salto de línea tras el banner para separar visualmente la cabecera de la ejecución.
🧪 Ejemplo reproducible
vars:
remote_user: luisgulo
tasks:
- name: listar directorio de root desde otro usuario
module: run
args:
command: "ls -l /root"
become: true📦 Cambios internos
- Se detecta
remote_userdesdevarsy se construye el destino SSH comousuario@host. - Se mantiene compatibilidad con módulos que usan
becomedentro deargs. - Se reordena la función
shflow_banner()para que se invoque correctamente al inicio.
🧁 Compatibilidad
- Compatible con playbooks existentes sin
remote_user. - Compatible con módulos que ya usan
become. - Compatible con entornos multiusuario y claves SSH por usuario.
📁 Archivos modificados
shflow.shexamples/remote_user.yaml(nuevo ejemplo de prueba)
🧩 Versión 1.5.1 — 2025-09-28
✨ Nuevas funcionalidades
- Se añaden variables nativas
capture_log,capture_erryregisterpara capturar salida y código de error por tarea. - Se permite evaluar condiciones declarativas usando variables capturadas (
condition: '[ {{ ping_status }} -eq 0 ]'). - Se implementa compatibilidad con
registerpara usuarios provenientes de Ansible. - Se habilita interpolación de variables capturadas en argumentos (
args) y condiciones (condition). - Se encapsula ejecución de módulos con
set +epara evitar abortos silenciosos en tareas fallidas.
🧪 Trazas reproducibles
tasks:
- name: Verificar conectividad
module: ping
args:
target: 192.168.1.1
capture_log: ping_output
capture_err: ping_status
- name: Mostrar resultado
module: echo
args:
message: "{{ ping_output }}"
- name: Apagar si hay conectividad
module: run
args:
command: "shutdown -h now"
condition: '[ {{ ping_status }} -eq 0 ]'📦 Cambios internos
- Se añade
declare -A shflow_varspara almacenar variables capturadas. - Se aplica
set +eyset -ealrededor de ejecución de módulos para capturar errores sin abortar. - Se mejora interpolación de
{{ variable }}en argumentos y condiciones.
🧁 Compatibilidad
- Compatible con playbooks existentes.
- Compatible con
registerde Ansible. - Compatible con módulos que devuelven código de salida (
return 1).
📁 Archivos modificados
shflow.sh
🧩 v1.4.7 — [2025-09-28]
- Se añade soporte para
hostgroup:en el playbook como alternativa declarativa a-g - Permite ejecutar tareas sobre grupos definidos en el inventario sin necesidad de parámetros CLI
- Mejora la reproducibilidad y portabilidad de los playbooks
- Validación defensiva si el grupo no existe o está vacío
- Se mantiene compatibilidad con
hosts:,-hy-gcomo fuentes de destino
🧩 v1.4.5 — [2025-09-25]
- Soporte para la clave
condition:en tareas del playbook - Las condiciones se evalúan como expresiones Shell (
bash -c) - Se permite usar
{{ name }}y{{ label }}dentro de la condición - Las tareas se omiten si la condición falla, con trazas claras y reproducibles
- Se evita cargar módulos innecesarios si la condición no se cumple
🧩 v1.4.4 — [2025-09-24]
- Validación defensiva del tipo de
tasks:en el playbook - Se verifica que
tasks:sea una lista (array) antes de procesar - Se evita el error
jq: Cannot index array with string "tasks" - Se añaden trazas claras si no hay tareas o si la estructura es incorrecta
🧩 v1.4.3 — [2025-09-24]
- Parche defensivo para eliminar espacios en nombres de host definidos en
hosts:del playbook - Soluciona errores como
hostname contains invalid charactersen ejecución remota - Mejora la robustez en entornos con inventarios mixtos o entradas manuales
🧩 v1.4.2 — [2025-09-24]
- Agrupación visual por host en la salida (
stdout) para evitar trazas entrelazadas - Cada bloque de ejecución se encapsula por host, incluso en modo paralelo
- Mejora la legibilidad y trazabilidad en auditorías
🧩 v1.4.1 — [2025-09-24]
- Soporte para
parallelism:en el playbook (truepor defecto) - Permite ejecución secuencial si se define
parallelism: false - Compatible con
hosts:,-hy-gcomo fuentes de destino
🧩 v1.4.0 — [2025-09-24]
- Soporte para
hosts:en el playbook como alternativa a-h - Iteración multi-host automática si no se pasa
-h - Ejecución tolerante a errores por host
🧩 v1.3.11 — [2025-09-24]
- Corrección crítica de compatibilidad con
yq 3.4.3usandoyq -r .tasks - Se añade la función
load_tasks()para encapsular la carga de tareas con trazabilidad defensiva - Validación de que el array de tareas no esté vacío antes de ejecutar
- Se elimina el uso incorrecto de
yq r -j tasks, que provocaba errores de interpretación - Ejecución robusta de múltiples tareas en un mismo playbook
- Preparado para entornos con
set -euo pipefail
🧩 v1.3.10 — [2025-09-22]
- Compatibilidad con
yq 4.xusandoyq -o=json '.' - Mejora de trazabilidad en parsing de argumentos
- Preparación para función
load_tasks()modular
🧩 v1.3.9 — [2025-09-20]
- Manejo defensivo de errores por tarea: si una falla, el flujo continúa
- Se elimina
set -een favor deset -euo pipefail - Trazas claras de éxito/fallo por tarea
🧩 v1.3.8 — [2025-09-18]
- Corrección de parsing de argumentos con espacios
- Se elimina encapsulado innecesario con comillas dobles
- Ejecución estable de comandos complejos en módulos como
run.sh
🧩 v1.3.6 — [2025-09-10]
- Versión base con soporte para
-f,-h,-g,--debug - Resolución de hosts desde inventario YAML
- Ejecución de módulos por tarea con argumentos dinámicos
- Dependencias:
yq,jq,ssh,bash