📜 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 como shflow_vars.
  • Las variables globales pueden ser sobrescritas por vars: en el playbook, respetando la jerarquía declarativa.
  • Se permite heredar become: true desde all.yaml si no está definido en la tarea, permitiendo escalado automático con sudo.

🧪 Ejemplo reproducible

# all.yaml
become: true

# playbook.yaml
tasks:
  - name: Actualizar sistema completo
    module: package
    args:
      state: system-update

📦 Cambios internos

  • Se carga all.yaml antes que vars: del playbook, permitiendo sobrescritura.
  • Se añade lógica defensiva para incluir become en ARG_VALUES si no está en args.
  • 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_user como clave declarativa en vars, permitiendo conectar por SSH como otro usuario.
  • Se mantiene compatibilidad con become: true, permitiendo escalar privilegios vía sudo desde el usuario remoto.
  • Se implementa lógica combinada para los cuatro casos posibles: con/sin remote_user y con/sin become.
  • 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_user desde vars y se construye el destino SSH como usuario@host.
  • Se mantiene compatibilidad con módulos que usan become dentro de args.
  • 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.sh
  • examples/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_err y register para 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 register para 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 +e para 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_vars para almacenar variables capturadas.
  • Se aplica set +e y set -e alrededor 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 register de 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:, -h y -g como 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 characters en 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 (true por defecto)
  • Permite ejecución secuencial si se define parallelism: false
  • Compatible con hosts:, -h y -g como 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.3 usando yq -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.x usando yq -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 -e en favor de set -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