Mejores Prácticas de Scripting de Sistemas
Los scripts en los que puedes confiar sin supervisión siguen las mismas reglas de operabilidad que los servicios de producción: modos de fallo predecibles, valores predeterminados seguros y registros que los operadores pueden buscar a las 3 a.m.
Cómo Usar Esta Lista
- Aplica antes de programar cualquier script en cron o CI.
- Bloquea la revisión si faltan
--dry-runpara herramientas mutables. - Revisa después de cualquier incidente causado por reejecuciones de automatización o trabajos superpuestos.
A - Estructura y CLI
- Usa
if __name__ == "__main__"y una funciónmain() -> int. Mantiene los módulos importables y testeables. - Analiza argumentos con
argparseotyper. Documenta las flags en--helpy README. - Soporta
--dry-runpara acciones destructivas. Imprime los cambios previstos sin efectos secundarios. - Reserva
stdoutpara salida de máquina; registra para humanos enstderr. Permite canalizar líneas JSON limpiamente. - Devuelve códigos de salida documentados. 0 ok, 2 uso, 1 fallo - coincide con las convenciones de la organización.
B - Archivos y Datos
- Usa
pathlibpara todas las operaciones de rutas. Evita uniones de rutas de cadenas. - Especifica
encoding="utf-8"en archivos de texto. Previene sorpresas con la configuración predeterminada de la plataforma. - Escribe salidas atómicamente (temporal + reemplazo). Los lectores nunca ven archivos medio escritos.
- Valida las entradas antes de la mutación. Falla rápidamente en directorios vacíos, variables de entorno faltantes, flags incorrectas.
- Haz que las reejecuciones sean idempotentes. Superposición segura de cron o comportamiento explícito de
flock/skip.
C - Procesos y Red
- Llama a
subprocesscon listas deargv, no cadenas de shell. Elimina la inyección a menos que sea una excepción documentada. - Establece tiempos de espera para
subprocessy HTTP. Los trabajos colgados no deben bloquear cron para siempre. - Reintenta errores transitorios con un límite de retroceso (backoff cap). Registra el fallo final con contexto.
- Nunca registres secretos, tokens o URLs pre-firmadas. Redacta las cabeceras
Authorization. - Verifica las firmas de las webhooks antes de procesar el cuerpo. Rechaza eventos entrantes sin firmar.
D - Programación y Operaciones
- Usa rutas absolutas al
pythondevenvencrontab. Incluyecda la raíz del proyecto. - Previene ejecuciones superpuestas con un bloqueo de archivo o distribuido. Sale con 0 al omitir instancias duplicadas si es apropiado.
- Emite registros estructurados (JSON) para scripts de producción. Incluye acción, ruta, duración, ID de correlación.
- Monitoriza externamente el latido de la última ejecución exitosa. Detecta fallos silenciosos de cron.
- Versiona los scripts en git con CI ejecutando
ruff/pytest. La misma puerta de calidad que el código de la aplicación.
E - Remoto y Escalado
- Prefiere Ansible sobre bucles
sshad-hoc para flotas. Usa scriptssshsolo para casos de emergencia. - Rechaza claves de host SSH desconocidas en la automatización.
known_hostso certificados gestionados. - Limita las operaciones remotas paralelas. Evita activar límites de tasa y bloqueos.
- Transmite archivos de registro grandes línea por línea. No leas archivos de varios GB en memoria.
- Promociona scripts estables a CLIs empaquetadas. Puntos de entrada
pyproject.tomlcuando el alcance crece.
Preguntas Frecuentes
¿Por qué es obligatorio el modo de simulación (dry-run)?
La primera ejecución en producción sin vista previa causa eliminaciones irreversibles; el modo de simulación es el seguro más barato.
¿Puedo usar `print` en scripts?
Para herramientas locales rápidas, sí; los scripts de producción programados deben usar registros con niveles.
¿Cómo elijo entre `argparse` y `typer`?
argparse para scripts de cron sin dependencias; typer al construir herramientas de operador con múltiples comandos.
¿Qué pasa con los archivos de configuración?
YAML/TOML en git para no secretos; variables de entorno para secretos; las anulaciones de CLI ganan en caso de conflicto.
¿Cómo documento los scripts para el personal de guardia?
Runbook con comandos de ejemplo, códigos de salida, tiempo de ejecución esperado y pasos de reversión.
¿Deberían los scripts llamar a las APIs de AWS?
Sí, con una sesión boto3 reutilizada, reintentos y rol de mínimo privilegio - ver la sección SDK de la Nube.
¿Cómo pruebo los scripts de cron?
pytest main() con tmp_path; prueba de integración en staging con dry-run y luego en vivo con datos de muestra.
¿Cuándo pasar a Airflow/Prefect?
Cuando las dependencias, SLAs y la observabilidad exceden un archivo y la matriz de cron se vuelve inmanejable.
¿Cómo manejo las zonas horarias?
Almacena UTC en registros y nombres de archivo; documenta el cron en hora local solo cuando el negocio lo requiera.
¿Cuál es el mayor antipatrón de scripting?
Éxito silencioso ante fallos parciales - siempre agrega errores y sal con un código distinto de cero cuando algo falló.
Relacionados
- Scripts Robustos - patrón completo de operabilidad
- Conceptos Básicos de Scripting - puntos de entrada y CLI
- Programación y Cron - higiene de cron
- subprocess e Interoperabilidad de Shell - ejecución segura de comandos
- Mejores Prácticas del SDK de la Nube - AWS desde scripts
Versiones de la Pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.