DevOps

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

Alfonso Moreno | Sysadmin Senior

Soy Alfonso, sysadmin senior con RHCE y más de 10 años administrando sistemas Linux para empresas y proyectos personales. Me especializo en infraestructura, redes, virtualización, monitoring, automation y self-hosting. Sobre SoyLinux.com SoyLinux.com es un blog técnico en español sobre Linux, software libre y self-hosting. Lo mantengo en mi tiempo libre. Áreas de expertise - Linux server administration: RHEL, CentOS, Rocky, Alma, Fedora, Debian, Ubuntu - Network services: Postfix, BIND, Samba, NFS, Squid - Virtualización y containers: KVM, Proxmox, Docker, Podman - Monitoring: Prometheus, Grafana, Zabbix - Automation: Ansible, Bash scripting - Self-hosting: Vaultwarden, Nextcloud, Jellyfin, Immich, Homelab Contacto - Email: [email protected]

4 thoughts on “Ansible desde cero: automatiza tu infraestructura en 2026”

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *