


Crear y revisar automatización de infraestructura con Ansible sin debilitar la seguridad
Úsalo cuando una IA escriba o cambie automatización de infraestructura con Ansible. Pasa los lint y controles de seguridad sin advertencias, deja los secretos fuera del repositorio, revisa la red de abajo arriba, demuestra que las pruebas detectan el fallo e informa solo de lo ejecutado.
Para usar estas reglas de IA
## Priorizar la seguridad y la estabilidad, y cambiar solo lo que se pidió
Trata la automatización de infraestructura como código crítico para la seguridad: un pequeño error de configuración puede debilitar silenciosamente la privacidad, el control de acceso, el enrutamiento o la disponibilidad del servicio.
- Prefiere la estabilidad al volumen de funciones, la seguridad a la comodidad y la claridad al ingenio.
- Resuelve exactamente el problema solicitado. Mantén las correcciones no relacionadas y las funciones especulativas en trabajos separados.
- Comprueba las suposiciones ejecutando la automatización afectada antes de declarar terminado un cambio.
- Resiste la incorporación de nuevas dependencias. Cada dependencia amplía la superficie de ataque y la carga de mantenimiento.
- Sigue los patrones existentes del repositorio antes de introducir nuevas abstracciones u opciones de configuración.
- Trata cada opción nueva como superficie de prueba adicional; añádela solo cuando los usuarios tengan una necesidad demostrada.
- Usa despliegues nuevos para las pruebas de comportamiento cuando el estado conservado pueda ocultar defectos.
## Pasar todos los lint y controles de seguridad sin ninguna advertencia
Ejecuta el control de calidad local completo del repositorio antes de la revisión. Debe abarcar análisis de configuración, YAML y lenguaje, análisis de shell, análisis estático de seguridad, comprobaciones de sintaxis de playbooks y las pruebas unitarias pertinentes.
No se admite ninguna advertencia en la integración continua. En la automatización sensible a la seguridad, los hallazgos aparentemente cosméticos pueden ocultar plantillas rotas, permisos de archivo inseguros o una regresión real entre ruido recurrente.
Resuelve los hallazgos en este orden:
1. Corrige el problema subyacente.
2. Si la regla no es adecuada para el repositorio, inclúyela en la lista de permitidas de la configuración de la herramienta responsable y explica el motivo.
3. Usa una supresión en línea solo como último recurso, nombrando la regla exacta y documentando la excepción.
No traslades los hallazgos a una lista permanente de advertencias. Una regla debe cumplirse o excluirse explícitamente con una justificación duradera.
Entre las comprobaciones obligatorias habituales se incluyen:
- Iniciar los documentos YAML con `---` y entrecomillar las claves ambiguas de los flujos de trabajo cuando lo exija el analizador.
- Preferir condiciones de fallo explícitas, como `failed_when`, frente a un uso amplio de `ignore_errors`.
- Mantener un espaciado coherente en Jinja2.
- Especificar `mode` en cada tarea de archivo o directorio en vez de depender de `umask`.
- Entrecomillar las variables de shell y activar el tratamiento estricto de errores de shell.
- Tratar las supresiones del análisis estático como excepciones revisables, no como atajos.
Antes de enviar un cambio, examina la diferencia, registra las comprobaciones ejecutadas y confirma que la integración continua realizará las mismas validaciones esenciales.
## Revisar las entradas pronto y dejar los secretos fuera del repositorio
Valida las entradas antes de operaciones costosas o que cambien el estado. Rechaza colecciones vacías, configuraciones ausentes, direcciones mal formadas, versiones incompatibles y discrepancias de permisos en el primer punto fiable.
- Establece explícitamente los modos de archivos y directorios.
- Falla ante errores de permisos, autenticación, criptografía o límites de seguridad. Reserva las advertencias para comportamientos realmente opcionales.
- Haz que los errores sean accionables indicando la condición fallida y la medida correctiva segura.
- Aplica el mínimo privilegio: reduce al mínimo permisos, cuentas, credenciales conservadas y capacidades de procesos.
- Usa valores predeterminados seguros, criptografía sólida, reglas de cortafuegos estrictas, registro mínimo y retención mínima de datos.
- Nunca guardes contraseñas, claves privadas, tokens de acceso ni credenciales de proveedores en el control de código fuente.
- Responde con rapidez a las vulnerabilidades de seguridad confirmadas y verifica el comportamiento actualizado.
- Evita soluciones provisionales no documentadas. Registra por qué existe una solución provisional y referencia su incidencia de origen para que los responsables puedan retirarla con seguridad más adelante.
Busca un patrón establecido en la base de código antes de añadir una tarea, condición, ruta de proveedor o módulo. Reutiliza el flujo de control existente salvo que las evidencias demuestren que no es adecuado.
## Evitar errores comunes en los loops de Ansible y las plantillas Jinja2
No reemplaces mecánicamente la iteración antigua por `loop`. Algunas formas de iteración antiguas aplanan listas anidadas, mientras que `loop` las conserva. Verifica la forma resultante del elemento y confirma que se crean los archivos o recursos esperados.
- Pasa una lista directamente a `loop`; no envuelvas una lista existente dentro de otra.
- Combina listas explícitamente cuando la construcción anterior aplanaba varias entradas.
- Evita barras finales en las variables de ruta para impedir separadores duplicados.
- En comandos y controladores de solo lectura, establece `changed_when: false` para mantener precisos los informes de estado.
- Usa `failed_when: false` solo cuando el fallo del comando sea expresamente esperado y seguro; no ocultes fallos no relacionados.
Bajo la evaluación nativa de Jinja2:
- Las condiciones requieren valores booleanos reales, no cadenas como `"true"` y `"false"`.
- Pasa las variables directamente a las búsquedas; no anides expresiones de plantilla dentro de otra expresión de plantilla.
- Analiza explícitamente el texto JSON cuando una búsqueda devuelva el contenido de un archivo.
- Recuerda que `default()` no sustituye una cadena vacía salvo que esté activada su opción para valores falsos.
- Sustituye las comprensiones de listas complejas generadas por plantillas por bucles normales de automatización y acumulación explícita.
- Usa pruebas para predicados booleanos y filtros para transformar datos.
Prueba las plantillas con los filtros reales del marco de automatización o con imitaciones fieles. La validez sintáctica por sí sola no demuestra el comportamiento en modo nativo.
## Depurar servicios de red capa por capa, empezando por los puertos en escucha
Depura la automatización de red desde la capa incierta más baja, en vez de suponer que todo síntoma de conectividad es un fallo de enrutamiento.
1. Confirma que los sockets TCP y UDP esperados escuchan en la dirección y el puerto previstos.
2. Examina el estado del servicio y de la unidad de socket para detectar advertencias de configuración.
3. Verifica los ajustes de red requeridos del núcleo.
4. Prueba directamente la resolución de nombres contra el resolvedor configurado.
5. Solo entonces examina las reglas de cortafuegos, traducción de direcciones y enrutamiento por políticas.
En servicios activados por socket, configura la unidad de socket, no solo la configuración del servicio. Borra los escuchadores heredados cuando sea necesario, define escuchadores tanto de flujo como de datagramas y reinicia el socket después de los cambios. Desactivar el socket puede romper dependencias del servicio.
Ten en cuenta deliberadamente las diferencias entre plataformas:
- Los sistemas de cortafuegos pueden reordenar las reglas; fija o verifica el sistema cuyo comportamiento espera la automatización.
- Los equipos con varias conexiones de red pueden necesitar una interfaz de salida explícita para la traducción de direcciones.
- Prefiere el enmascaramiento sencillo con interfaz especificada frente a una complejidad innecesaria de traducción de origen cuando cumpla el requisito.
- Añade indicadores de compatibilidad de forma condicional después de detectar la versión de la herramienta instalada.
- Encierra los puntos de conexión IPv6 entre corchetes cuando lo requiera la sintaxis de host y puerto.
- Comprueba la resolución de nombres antes de rediseñar las reglas de enrutamiento o traducción.
Mantén sencillas las reglas de red y prueba el flujo de paquetes, en lugar de inferir el éxito a partir del resultado de una tarea.
## Demostrar que cada prueba de regresión falla cuando vuelve el error
Una prueba de regresión debe demostrar que detecta el defecto que afirma evitar.
1. Escribe una prueba enfocada en el caso de fallo.
2. Introduce temporalmente el defecto o modifica la condición correspondiente.
3. Confirma que la nueva prueba falla por el motivo previsto.
4. Restaura la implementación correcta y confirma que la prueba pasa.
5. Documenta la regresión exacta que protege la prueba.
Cuando el comportamiento dependa de plantillas, rutas de archivos, permisos, reglas de cortafuegos o formas de colecciones, prueba el resultado observable y no solo el texto generado. Verifica, según corresponda, los archivos creados, los modos efectivos, los valores analizados, el estado de los escuchadores, el flujo de paquetes o la salida renderizada.
Actualiza las pruebas existentes cuando un cambio altere rutas o comportamiento. No supongas que una prueba aprobada es significativa hasta que se haya demostrado su sensibilidad al fallo.
## Desplegar sin preguntas interactivas e informar solo de las pruebas hechas
La automatización destinada a la integración continua o a agentes debe admitir una ruta totalmente no interactiva.
- Debe omitirse toda solicitud cuando su variable esté predefinida mediante un parámetro o variable de entorno aprobados.
- Documenta el conjunto completo de variables principales, sus tipos, valores predeterminados y propósito.
- Mantén las credenciales específicas de proveedores separadas de la configuración ordinaria y acéptalas solo mediante canales de secretos aprobados.
- Exige variables de confirmación explícitas para modos de despliegue locales o de gran impacto.
- Asegúrate de que las funciones opcionales tengan valores booleanos explícitos para que las ejecuciones sin interfaz no se detengan por entradas ausentes.
- Prueba la ruta no interactiva desde un entorno limpio con condiciones representativas de varias interfaces y direcciones.
Antes de finalizar, ejecuta todos los analizadores, comprobaciones de sintaxis, pruebas unitarias pertinentes y un despliegue nuevo o una prueba de integración equivalente. Revisa la diferencia para detectar correcciones no relacionadas, dependencias sin justificación, supresiones ocultas, modos de archivo ausentes, secretos y comportamiento no documentado. Informa de las evidencias exactas recogidas y no afirmes que el despliegue tuvo éxito si solo se ejecutaron comprobaciones estáticas.
