Ansible desde cero: automatiza tu infraestructura en 2026
Ansible es la herramienta de automatización de infraestructura más popular del mundo. Aprende desde cero a automatizar tu Linux, cloud y redes.
TL;DR — Lo que vas a tener al final
- Tiempo de setup: 30 minutos a 2 horas dependiendo de la complejidad del entorno.
- Requisitos: Acceso root, Linux moderno, conexión a internet para descargar dependencias.
- Resultado: Servicio funcional y estable, documentado paso a paso.
- Troubleshooting: Logs estándar en /var/log/, comandos de verificación al final de cada sección.
¿Por qué Ansible?
Ansible es una herramienta de Infrastructure as Code (IaC) que te permite:
- Configurar servidores remotos vía SSH
- Desplegar aplicaciones
- Orquestar tareas en múltiples máquinas
- Provisionar infraestructura cloud
Ventajas sobre otras herramientas:
- Sin agente: usa SSH, no instalas nada en los servidores remotos
- YAML legible: los playbooks son archivos de texto que se leen
- Idempotente: puedes correr el mismo playbook 100 veces y el resultado es el mismo
- Grande ecosistema: 4000+ módulos oficiales
Instalación
# Ubuntu/Debian
sudo apt install ansible
# Fedora/RHEL
sudo dnf install ansible
# O via pip (recomendado para última versión)
pip install ansible --user
Verificar:
ansible --version
# ansible [core 2.16.x]
# config file = /etc/ansible/ansible.cfg
# ...
Conceptos básicos
Inventario
Lista de servidores que Ansible va a gestionar.
Playbook
Archivo YAML con las tareas a ejecutar.
Task
Una acción específica (instalar paquete, copiar archivo, etc).
Module
Código reutilizable que ejecuta una acción (apt, copy, service, etc).
Role
Conjunto reutilizable de tasks, handlers, templates y variables.
Primer inventario
Crea inventory.ini:
[webservers]
web1.example.com
web2.example.com
web3.example.com
[databases]
db1.example.com
db2.example.com
[production:children]
webservers
databases
[all:vars]
ansible_user=deploy
ansible_ssh_private_key_file=~/.ssh/id_ed25519
Probar conexión:
ansible all -i inventory.ini -m ping
Si SSH funciona y Ansible puede conectar, verás:
web1.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
Primer playbook
Crea playbook.yml:
---
- name: Configurar servidores web
hosts: webservers
become: yes # usar sudo
tasks:
- name: Actualizar paquetes
apt:
update_cache: yes
upgrade: dist
- name: Instalar nginx
apt:
name: nginx
state: present
- name: Copiar config de nginx
copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
notify: Reiniciar nginx
- name: Asegurar que nginx está corriendo
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Reiniciar nginx
service:
name: nginx
state: restarted
Ejecutar:
ansible-playbook -i inventory.ini playbook.yml
Verás el output paso a paso. Si una task cambia algo, mostrará changed: 1. Si no cambia nada (idempotencia), changed: 0.
Comandos ad-hoc
Ansible no requiere playbook para tareas simples:
# Ver uptime de todos los servidores
ansible all -i inventory.ini -a "uptime"
# Reiniciar un servicio
ansible webservers -i inventory.ini -b -a "systemctl restart nginx"
# Ver espacio en disco
ansible all -i inventory.ini -a "df -h"
# Copiar archivo
ansible webservers -i inventory.ini -m copy -a "src=/local/file dest=/remote/file"
# Instalar paquete
ansible webservers -i inventory.ini -b -m apt -a "name=htop state=present"
Variables y facts
Variables definidas en playbooks
- hosts: webservers
vars:
http_port: 80
max_clients: 200
tasks:
- name: Crear config con variable
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
Facts (info automática del sistema)
Ansible detecta automáticamente info de cada servidor:
- name: Mostrar facts
debug:
msg: "OS: {{ ansible_distribution }} {{ ansible_distribution_version }} - IP: {{ ansible_default_ipv4.address }}"
Facts disponibles: ansible_hostname, ansible_architecture, ansible_memtotal_mb, ansible_processor_count, etc.
Handlers
Los handlers se ejecutan solo si una task los notifica (cambia el estado):
tasks:
- name: Copiar config
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
notify: Reiniciar nginx
handlers:
- name: Reiniciar nginx
service:
name: nginx
state: restarted
Si 5 tasks notifican el mismo handler, se ejecuta solo 1 vez al final.
Roles: organización
Para proyectos grandes, usa roles:
my-project/
├── inventory.ini
├── playbook.yml
└── roles/
├── common/
│ ├── tasks/main.yml
│ ├── handlers/main.yml
│ └── defaults/main.yml
├── webserver/
│ ├── tasks/main.yml
│ ├── templates/
│ └── files/
└── database/
└── tasks/main.yml
playbook.yml:
- hosts: webservers
roles:
- common
- webserver
- hosts: databases
roles:
- common
- database
Roles populares en Ansible Galaxy:
- geerlingguy.nginx
- geerlingguy.postgresql
- geerlingguy.docker
- geerlingguy.security
ansible-galaxy install geerlingguy.nginx
Casos prácticos
1. Desplegar aplicación Node.js
- hosts: webservers
become: yes
tasks:
- name: Crear usuario para la app
user:
name: myapp
shell: /bin/bash
- name: Instalar clave GPG de Nodesource
apt_key:
url: https://deb.nodesource.com/gpg/nodesource.gpg.key
state: present
- name: Agregar repo Nodesource para Node.js 22
apt_repository:
repo: "deb https://deb.nodesource.com/node_22.x {{ ansible_distribution_release }} main"
state: present
update_cache: yes
- name: Instalar Node.js 22
apt:
name: nodejs
state: present
- name: Crear directorio de la app
file:
path: /opt/myapp
state: directory
owner: myapp
group: myapp
- name: Copiar código
copy:
src: ./app/
dest: /opt/myapp/
owner: myapp
group: myapp
- name: Instalar dependencias
npm:
path: /opt/myapp
state: present
- name: Configurar systemd service
copy:
src: myapp.service
dest: /etc/systemd/system/myapp.service
- name: Recargar unidades de systemd
systemd:
daemon_reload: yes
- name: Iniciar servicio
systemd:
name: myapp
state: started
enabled: yes
2. Hardening de SSH
- hosts: all
become: yes
tasks:
- name: Backup config SSH original
copy:
src: /etc/ssh/sshd_config
dest: /etc/ssh/sshd_config.bak
remote_src: yes
- name: Aplicar hardening
lineinfile:
path: /etc/ssh/sshd_config
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
loop:
- { regexp: "^#?PermitRootLogin", line: "PermitRootLogin no" }
- { regexp: "^#?PasswordAuthentication", line: "PasswordAuthentication no" }
- { regexp: "^#?X11Forwarding", line: "X11Forwarding no" }
- { regexp: "^#?MaxAuthTries", line: "MaxAuthTries 3" }
- { regexp: "^#?ClientAliveInterval", line: "ClientAliveInterval 300" }
notify: Reiniciar SSH
3. Backup automatizado
- hosts: databases
become: yes
tasks:
- name: Crear directorio de backups
file:
path: /var/backups/db
state: directory
- name: Backup PostgreSQL
cron:
name: "PostgreSQL backup"
minute: "0"
hour: "2"
job: "/usr/bin/pg_dump -U postgres mi_db | gzip > /var/backups/db/$(date +%F).sql.gz"
Ansible Vault: cifrado de secretos
Para no commitear passwords en Git:
# Cifrar archivo
ansible-vault encrypt secret.yml
# Editar cifrado
ansible-vault edit secret.yml
# Ver cifrado
ansible-vault view secret.yml
# Usar en playbook
ansible-playbook playbook.yml --ask-vault-pass
O con password file:
ansible-playbook playbook.yml --vault-password-file ~/.vault_pass
AWX: interfaz web para Ansible
AWX (gratis) o Ansible Automation Platform (de pago) te da:
- Dashboard web
- Programación de jobs
- RBAC (control de acceso)
- Logs y auditoría
- API REST
Si tu equipo crece, vale la pena AWX.
Resumen
Ansible es la herramienta más rápida de aprender para IaC. Comienza con playbooks simples y escala a roles cuando los necesites.
Recursos para seguir:
- Documentación oficial: docs.ansible.com
- Galaxy: galaxy.ansible.com (roles compartidos)
- AWX: github.com/ansible/awx
Lee también: Docker en producción para los próximos pasos después de automatizar deploys, o Kubernetes en producción cuando tus apps crezcan.
Preguntas frecuentes
¿Por qué Ansible desde cero: automatiza tu infraestructura en 2026 es relevante para sysadmins Linux?
Forma parte del flujo diario de administración. Los conceptos explicados se aplican directamente a servidores en producción y resuelven problemas reales que enfrentan sysadmins hispanohablantes.
¿Qué necesito para empezar con Ansible desde cero: automatiza tu?
Distribución Linux actualizada (Debian, Ubuntu, RHEL, Fedora o Arch), acceso root, y conexión a internet. Para producción: entorno de staging separado antes de aplicar cambios.
¿Cuáles son los errores más comunes con Ansible desde cero: automatiza tu?
Los tres más frecuentes: (1) saltar la lectura de logs, (2) aplicar cambios directos en producción sin probar, (3) olvidar permisos y ownership. La documentación y un plan de rollback siempre.
¿Cuándo usar Ansible desde cero: automatiza tu y cuándo una alternativa?
Esta solución es ideal para el caso descrito. Alternativas como Docker, Ansible o configuración manual pueden ser mejores según contexto: portabilidad, escala y reproducibilidad son los factores clave.
¿Cómo migro desde una configuración previa a Ansible desde cero: automatiza tu?
Documentar el estado actual, probar la nueva configuración en staging, validar funcionalmente, y aplicar en producción con rollback plan listo. Los posts de SoyLinux incluyen troubleshooting para los problemas más comunes.
Lee también
- Guía Fedora 44: Novedades, Instalación y Upgrade para Sysadmins Linux
- Configura VLANs en Linux con nmcli: Guía paso a paso para sysadmins
- Protege tu SSH: Guía esencial para configurar Fail2ban en Linux
- Guía Definitiva: Configura Kubernetes con kubeadm en Ubuntu para Sysadmins Linux
- Configura Prometheus y Grafana: Guía DevOps para SysAdmins Linux

Pingback: Kubernetes en producción: las 7 reglas que todo SRE debe
Pingback: Kubernetes para principiantes: tu primer cluster en 2026 - Soy Linux
Pingback: Ansible para sysadmins: casos prácticos que no están en el tutorial - Soy Linux
Pingback: Automatización en Linux: Splunk y Ansible para Incidentes - Soy Linux