Automatización completa de actualización y reinicio controlado de parque de servidores Linux

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 o yum, 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 ser httpd, postgresql, etc).
  • Si tu proveedor SMTP requiere autenticación, añade los parámetros username y password al módulo mail.
  • ¿Problemas con los reinicios? Prueba a elevar reboot_timeout para servidores lentos, o añade esperas adicionales con el módulo wait_for.
  • ¿Tus parches requieren scripts post-update específicos? Añade tareas personalizadas tras el reboot, ¡Ansible lo soporta fácilmente!
Avatar

Por Mid