Introducción a ansible-lint
ansible-lint es una herramienta esencial para cualquier ingeniero DevOps o administrador de sistemas que utilice Ansible. Su función principal consiste en analizar playbooks, roles e inventarios buscando prácticas inadecuadas, errores comunes y posibles mejoras. Al integrar esta herramienta en el flujo de desarrollo, se puede detectar tempranamente problemas relacinoados con seguridad, mantenibilidad y compatibilidad, asegurando que los scripts de automatización sigan estándares coherentes y estén alineados con las mejores prácticas recomendadas por la comunidad Ansible.
Ventajas clave del análisis estático con ansible-lint
- Evita el uso innecesario de módulos
commandoshellcuando existen módulos específicos más seguros. - Identifica variables mal nombradas que no cumplen con convenciones como
snake_case. - Revisa permisos excesivos en archivos o directorios (por ejemplo, permisos 777).
- Advierte sobre sintaxis obsoletas que podrían dejar de funcionar en futuras versiones de Ansible.
- Ayuda a mantener un estilo uniforme en equipos grandes mediante reglas compartidas.
Instalación sencilla mediante pip
La forma más directa de instalar ansible-lint es a través de pip, siempre que tengas Python disponible:
pip install 'ansible-lint[github]'
Esta versión incluye soporte adicional para integraciones como GitHub Actions. Para verificar la instalación:
ansible-lint --version
Uso básico desde línea de comandos
Para escanear un archivo específico:
ansible-lint deploy-app.yml
Para analizar todos los playbooks dentro de un directorio de proyecto:
ansible-lint roles/
El comando mostrará una lista de advertencias y errores con su ID, descripción y ubicación exacta en el archivo.
Integración continua con GitHub Actions
Puedes automatizar el análisis cada vez que se abra un pull request. Crea el archivo .github/workflows/lint-ansible.yml:
name: Ansible Lint Check
on: [pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
python -m pip install ansible-lint
- name: Run ansible-lint
run: ansible-lint
Este flujo detendrá el proceso si se encuentran violaciones críticas, garantizando que solo se fusionen cambios limpios.
Personalización mediante archivo de configuración
Para adaptar las reglas a tus necesidades, crea un archivo .ansible-lint en la raíz del proyecto:
---
exclude_paths:
- .git/
- .venv/
- tests/inventory/
rulesdir:
- ./reglas-personalizadas/
skip_list:
- command-instead-of-module # Desactiva si hay casos justificados
- var-naming
strictness: high
Este archivo permite omitir rutas, cargar reglas personalizadas y ajustar el nivel de severidad.
Reglas comunes y cómo interpretarlas
| ID / Nombre | Descripción | Solución recomendada |
|---|---|---|
command-instead-of-module |
Se usa command para tareas que tienen módulo dedicado (ej. gestión de paquetes). |
Usar apt, yum, file, etc., según corresponda. |
no-changed-when |
Una tarea que modifica el sistema no define cuándo debe reportarse como "cambiado". | Añadir changed_when: true o una condición lógica explícita. |
var-naming |
Variables que no siguen formato snake_case o carecen de prefijo en roles. |
Renombrar a mi_rol_nombre_variable. |
Corrección automática de problemas simples
Ansible-lint puede arreglar automáticamente ciertos problemas de estilo:
ansible-lint --write --fix playbook.yml
Las correcciones incluyen formato de nombres de variables, indentación YAML y eliminación de redundancias. Es útil ejecutarlo antes de cada commit.
Extensión con reglas personalizadas
Si necesitas hacer cumplir políticas específicas de tu organización (por ejemplo, prohibir ciertos usuarios en tareas become), puedes escribir reglas en Python. Un ejemplo mínimo:
# reglas-personalizadas/regla_usuario.py
from ansiblelint.rules import AnsibleLintRule
class ProhibirUsuarioRoot(AnsibleLintRule):
id = '9001'
shortdesc = 'No usar become_user: root'
description = 'Evitar escalada directa a root; usar sudoers específicos.'
severity = 'HIGH'
def matchtask(self, task, file):
if task.get('become_user') == 'root':
return True
return False
Luego, activa el directorio en .ansible-lint y ansible-lint cargará tu regla personalizada.
Recursos recomendados
- Documentación oficial
- Repositorio en GitHub
- Ejemplos de configuraciones reales en proyectos open source