Automatización completa de actualización y reinicio controlado de parque de servidores Linux con Ansible
¿Quieres mantener seguros y al día tus servidores, sin perder el control de los reinicios y sin afectar servicios productivos? Este playbook de Ansible es la solución integral para coordinar actualizaciones masivas y reinicios organizados por grupos, evitando caídas o sobresaltos en producción.
¿Por qué es útil este playbook?
Los sysadmins conocen el terror de actualizar sistemas críticos: cada reinicio mal programado puede arruinar la noche (y el SLA). Automatizar con Ansible la actualización y reboot masivo, pero escalonado, te permite dormir tranquilo, ahorrando horas de trabajo manual, asegurando cumplimiento de parches y reduciendo el riesgo operativo.
Este playbook permite:
- Agrupar servidores para reiniciar solo un subconjunto a la vez (gracias a
serial
). - Actualizar paquetes críticos vía
apt
oyum
, adaptable a Debian y RHEL. - Notificar por correo electrónico el inicio y fin del proceso.
- Prevenir paradas inesperadas con chequeo de estado de servicios clave tras los reinicios.
Protip: perfecto para grandes clústeres, granjas web, o cualquier infraestructura que no pueda permitirse parar todos los nodos de golpe.
Playbook completo: update_reboot_rollout.yml
---
- name: Actualización y reinicio controlado de servidores Linux
hosts: all
become: yes
serial: 3
vars:
servicios_criticos:
- nginx
- mysql
email_destinatario: [email protected]
pre_tasks:
- name: Notificar inicio de mantenimiento
mail:
host: smtp.tuempresa.com
port: 25
to: "{{ email_destinatario }}"
subject: "[Ansible] Inicio de actualización y reboot masivo en lote"
body: "Comienza la actualización y reinicio escalonado del parque de servidores. Lote: {{ ansible_play_hosts }}"
delegate_to: localhost
tasks:
- name: Actualizar paquetes y parches de seguridad (Debian/Ubuntu)
apt:
upgrade: dist
update_cache: yes
autoremove: yes
when: ansible_facts['os_family'] == 'Debian'
- name: Actualizar paquetes y parches de seguridad (RHEL/CentOS)
yum:
name: '*'
state: latest
update_cache: yes
when: ansible_facts['os_family'] == 'RedHat'
- name: Chequear si se requiere reinicio (Debian/Ubuntu)
register: reboot_required_file
stat:
path: /var/run/reboot-required
when: ansible_facts['os_family'] == 'Debian'
- name: Indicar necesidad de reinicio (RHEL/CentOS)
shell: needs-restarting -r; echo $?
register: need_reboot_rhel
ignore_errors: yes
when: ansible_facts['os_family'] == 'RedHat'
- name: Reiniciar si es necesario (Debian/Ubuntu)
reboot:
msg: "Reiniciado tras actualización por Ansible."
connect_timeout: 5
reboot_timeout: 600
when: reboot_required_file.stat.exists
- name: Reiniciar si es necesario (RHEL/CentOS)
reboot:
msg: "Reiniciado tras actualización por Ansible."
connect_timeout: 5
reboot_timeout: 600
when: need_reboot_rhel.stdout == "1"
- name: Comprobar servicios críticos tras el reinicio
service:
name: "{{ item }}"
state: started
enabled: yes
loop: "{{ servicios_criticos }}"
register: estado_servicios
- name: Asegurar que todos los servicios críticos están 'running'
assert:
that:
- item.state == 'started'
loop: "{{ estado_servicios.results }}"
post_tasks:
- name: Notificar fin de lote y resultado
mail:
host: smtp.tuempresa.com
port: 25
to: "{{ email_destinatario }}"
subject: "[Ansible] Finalizado lote de update + reboot: {{ ansible_play_hosts }}"
body: |
Proceso completado en: {{ ansible_play_hosts }}
Estado servicios críticos: {{ estado_servicios }}
delegate_to: localhost
¿Cómo funciona (y cómo usarlo)?
- Establece serial: 3: solo tres servidores se actualizan y reinician simultáneamente.
- Envía notificación de inicio y fin (edita los parámetros SMTP/email para ajustarlos).
- Detecta plataforma (Debian/RedHat) y ejecuta el gestor de paquetes correcto.
- Reinicia solo si es necesario (¡sin reinicios innecesarios!).
- Tras cada reinicio, comprueba que los servicios críticos vuelven a estar activos.
Ejecuta el playbook con:
ansible-playbook -i tu_inventario update_reboot_rollout.yml
Ajusta serial
si tu infraestructura te permite actualizar más nodos a la vez.
Consejos extra y troubleshooting
- Edita
servicios_criticos
según lo que sea esencial en tu infraestructura (puede serhttpd
,postgresql
, etc). - Si tu proveedor SMTP requiere autenticación, añade los parámetros
username
ypassword
al módulomail
. - ¿Problemas con los reinicios? Prueba a elevar
reboot_timeout
para servidores lentos, o añade esperas adicionales con el módulowait_for
. - ¿Tus parches requieren scripts post-update específicos? Añade tareas personalizadas tras el reboot, ¡Ansible lo soporta fácilmente!