Cuando tuve que aplicar una configuración de hardening SSH en 150 servidores remotos para una organización sanitaria pública, hacerlo manualmente habría tomado horas y generado inconsistencias inaceptables. Con Ansible, desplegué la configuración en 3 minutos. Ansible es un motor de automatización IT open source que gestiona configuraciones, despliegues de software y orquestación de tareas complejas. Opera de forma declarativa y sin requerir agentes instalados en los sistemas gestionados, usando exclusivamente SSH. Imagina tener que actualizar la configuración de seguridad en 100 servidores distribuidos en tres datacenters. Sin automatización, es un proceso propenso a errores que puede dejar vulnerabilidades expuestas. Ansible resuelve este problema permitiéndote definir el estado deseado de tu infraestructura. En este tutorial aprenderás a instalar y configurar Ansible, comprender sus conceptos clave como inventario, playbook, task y module, escribir playbooks para automatizar tareas comunes, y utilizar variables y templates para crear configuraciones dinámicas y reutilizables.
Requisitos Previos para Ansible
Antes de comenzar, asegúrate de contar con un entorno Linux establecido. Para este tutorial, utilicé Ubuntu 22.04 LTS como nodo de control, pero los conceptos aplican a cualquier distribución. Necesitas:
- Un sistema Linux (Ubuntu, Debian, CentOS) con acceso root o privilegios
sudo. - Python 3.8 o superior instalado en el nodo de control.
- Acceso SSH por clave a los servidores remotos que vas a gestionar.
- Conocimiento básico de la shell de Linux y protocolo SSH.
- Al menos una máquina virtual o servidor remoto disponible para las pruebas.
Instalación de Ansible en Linux
Ansible se instala en el nodo de control, no en los servidores gestionados. Esto es una ventaja enorme frente a herramientas que requieren desplegar agentes. Puedes instalarlo usando los package manager nativos de tu distribución.
Instalación en Ubuntu/Debian
Actualiza el índice de paquetes e instala Ansible usando apt:
sudo apt update
sudo apt install ansible -y
Verifica la instalación revisando la versión:
ansible --version
El output mostrará la versión instalada, la ruta del archivo de configuración y la versión de Python utilizada. Para este tutorial, asumo que usas Ansible Core 2.14 o superior.
Instalación en CentOS/RHEL
Habilita el repositorio EPEL (Extra Packages for Enterprise Linux) e instala Ansible usando yum:
sudo yum install epel-release -y
sudo yum install ansible -y
Puedes consultar opciones avanzadas de instalación en la documentación oficial de Ansible (https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html).
Configuración del Inventario y Conexión SSH
El inventario de Ansible es un archivo que define los servidores que Ansible debe gestionar. Por defecto, Ansible busca este archivo en /etc/ansible/hosts. Ábrelo con un editor de texto y define tus servidores:
sudo nano /etc/ansible/hosts
Agrega los servidores organizados en grupos lógicos. Esto facilita aplicar configuraciones específicas a roles de servidor distintos:
[webservers]
webserver1 ansible_host=192.168.1.10
webserver2 ansible_host=192.168.1.11
[databases]
database1 ansible_host=192.168.1.20
En este ejemplo, creamos dos grupos: webservers y databases. Cada servidor tiene un alias y su dirección IP definida mediante la variable ansible_host.
Configuración del Acceso SSH
Ansible utiliza SSH para conectarse a los nodos remotos. Configurar la autenticación mediante clave pública evita ingresar contraseñas en cada ejecución y protege contra ataques de fuerza bruta. Genera una pareja de claves SSH en tu nodo de control:
ssh-keygen -t rsa
Copia la clave pública a los servidores remotos:
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
Reemplaza user con tu nombre de usuario real en los servidores remotos.
Creación y Ejecución de Playbooks
Un playbook en Ansible es un archivo YAML que declara el estado deseado de tus servidores. En lugar de escribir scripts imperativos que dicen «haz esto y luego esto otro», declaras el resultado final. Crea un archivo llamado install_nginx.yml:
---
- hosts: webservers
become: true
tasks:
- name: Actualizar cache de paquetes (Debian)
apt:
update_cache: yes
when: ansible_os_family == "Debian"
- name: Instalar Nginx (Debian)
apt:
name: nginx
state: present
when: ansible_os_family == "Debian"
- name: Actualizar cache de paquetes (CentOS)
yum:
update_cache: yes
when: ansible_os_family == "RedHat"
- name: Instalar Nginx (CentOS)
yum:
name: nginx
state: present
when: ansible_os_family == "RedHat"
- name: Iniciar y habilitar Nginx
service:
name: nginx
state: started
enabled: yes
Este playbook ejecuta tareas distintas según la familia del sistema operativo, definida por la condición when:. El parámetro hosts: webservers indica que las tareas solo se ejecutarán en el grupo definido previamente en el inventario. become: true permite escalar privilegios a root usando sudo. Lee también: Hardening SSH en Linux: Guía Completa 2026
Ejecución del Playbook
Ejecuta el playbook desde la terminal:
ansible-playbook install_nginx.yml
Ansible se conecta a los servidores y aplica las tareas. Si todo funciona, verás un resumen con ok para tareas exitosas y changed para tareas que modificaron el estado del servidor. Si una tarea falla, el output mostrará failed, lo que te permite identificar rápidamente el problema de permisos o conectividad.
Uso de Variables y Templates Jinja2
Las variables y templates son fundamentales para evitar repetir código. Permiten que un mismo playbook sirva para desplegar configuraciones distintas en entornos de desarrollo y producción.
Definición de Variables
Puedes definir variables directamente en el playbook usando la sección vars. Esto aísla los valores que pueden cambiar entre ejecuciones:
---
- hosts: webservers
become: true
vars:
nginx_port: 8080
tasks:
- name: Instalar Nginx
apt:
name: nginx
state: present
when: ansible_os_family == "Debian"
- name: Iniciar Nginx
service:
name: nginx
state: started
enabled: yes
Aquí, la variable nginx_port tiene el valor 8080. Puedes invocar esta variable en cualquier task o template dentro del playbook.
Uso de Templates
Los templates usan el motor Jinja2 para generar archivos de configuración dinámicos basados en variables. Crea un archivo llamado nginx.conf.j2:
server {
listen {{ nginx_port }};
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
}
Este template inyecta el valor de nginx_port en el archivo de configuración. Para aplicarlo, añade un task en tu playbook:
- name: Copiar configuración de Nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify: Reiniciar Nginx
handlers:
- name: Reiniciar Nginx
service:
name: nginx
state: restarted
El module template procesa el archivo Jinja2 y lo copia al destino. El parámetro notify activa el handler Reiniciar Nginx únicamente si el archivo de configuración cambió, garantizando idempotencia.
Errores Comunes y Resolución de Problemas
- Error de conexión SSH: Verifica que las claves SSH estén correctamente copiadas y que el usuario definido en tu inventario tenga acceso. Comprueba la conectividad básica con
pingantes de ejecutar el playbook. - Error de sintaxis en YAML: Ansible es estricto con la indentación. Un espacio de más o menos rompe la ejecución. Usa un linter como
ansible-linto validadores YAML en línea para revisar la estructura. - Fallo en la ejecución de tasks: Revisa el output detallado usando la bandera
-vvv. Los fallos frecuentes provienen de paquetes no encontrados en los repositorios, rutas incorrectas o falta de privilegiossudo. - Problemas de idempotencia: Si un task muestra
changeden cada ejecución aunque el estado ya es el deseado, revisa que el module utilizado verifique el estado actual antes de aplicar cambios.
Conclusiones con Puntos Clave Operativos
Ansible transforma tareas manuales de horas en ejecuciones de segundos, reduciendo la ventana de error humano. Dominar esta herramienta es un requisito para gestionar infraestructuras modernas y cumplir con estándares de seguridad. Los puntos clave operativos a recordar:
- Ansible opera sin agentes, delegando toda la comunicación a SSH.
- Los playbooks declaran el estado deseado del sistema en formato YAML.
- El inventario clasifica los nodos para ejecuciones dirigidas.
- Las variables y templates Jinja2 garantizan la reutilización del código en múltiples entornos.
Ahora tienes las bases para automatizar tu infraestructura. Sigue experimentando y aplica estos conceptos en tus despliegues.