Configuración Automatizada de la Sincronización Horaria en RedHat/CentOS con Ansible

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

La sincronización horaria precisa es fundamental para garantizar el correcto funcionamiento de servicios críticos como registros de auditoría, autenticación Kerberos, comunicaciones seguras, y sistemas distribuidos. En entornos RedHat/CentOS, existen dos mecanismos principales para la sincronización de tiempo: NTP (Network Time Protocol) y Chrony. Este artículo describe cómo automatizar la configuración de la sincronización horaria usando Ansible, priorizando el uso de NTP sobre Chrony.

Objetivo del Playbook

El propósito del playbook de Ansible es:

  1. Detectar si el sistema tiene instalado ntp o chrony.
  2. Instalar ntp si ninguno está presente.
  3. Configurar ntp si está presente o ha sido instalado.
  4. Configurar chrony sólo si está presente y ntp no lo está.
  5. Verificar el estado del servicio de sincronización.
---
- name: Configurar sincronización horaria en RedHat/CentOS (prioriza NTP)
  hosts: "{{ target_hosts }}"
  become: true
  vars:
    ntp_server: "0.pool.ntp.org"

  tasks:
    - name: Verificar si NTP está instalado
      ansible.builtin.shell: rpm -q ntp
      register: ntp_installed
      ignore_errors: true

    - name: Verificar si Chrony está instalado
      ansible.builtin.shell: rpm -q chrony
      register: chrony_installed
      ignore_errors: true

    - name: Instalar NTP si no hay ninguno
      ansible.builtin.yum:
        name: ntp
        state: present
      when: ntp_installed.rc != 0 and chrony_installed.rc != 0

    - name: Configurar NTP si está presente o se ha instalado
      when: ntp_installed.rc == 0 or (ntp_installed.rc != 0 and chrony_installed.rc != 0)
      block:
        - name: Comentar líneas 'server' en ntp.conf
          ansible.builtin.replace:
            path: /etc/ntp.conf
            regexp: '^server'
            replace: '#server'

        - name: Añadir servidor NTP
          ansible.builtin.lineinfile:
            path: /etc/ntp.conf
            line: "server {{ ntp_server }} iburst"
            insertafter: EOF

        - name: Añadir restricciones
          ansible.builtin.blockinfile:
            path: /etc/ntp.conf
            block: |
              restrict default kod nomodify notrap nopeer noquery
              restrict 127.0.0.1
              restrict ::1

        - name: Habilitar y reiniciar ntpd
          ansible.builtin.service:
            name: ntpd
            state: restarted
            enabled: yes

    - name: Configurar Chrony si está presente pero no NTP
      when: ntp_installed.rc != 0 and chrony_installed.rc == 0
      block:
        - name: Comentar líneas 'pool' y 'server' en chrony.conf
          ansible.builtin.replace:
            path: /etc/chrony.conf
            regexp: '^(pool|server)'
            replace: '#\1'

        - name: Añadir servidor Chrony
          ansible.builtin.lineinfile:
            path: /etc/chrony.conf
            line: "server {{ ntp_server }} iburst"
            insertafter: EOF

        - name: Habilitar y reiniciar chronyd
          ansible.builtin.service:
            name: chronyd
            state: restarted
            enabled: yes

    - name: Verificar estado del sistema
      ansible.builtin.shell: timedatectl status
      register: time_status
      changed_when: false

    - name: Verificar fuentes de sincronización
      ansible.builtin.shell: |
        ntpq -p || chronyc sources -v
      register: ntp_sources
      changed_when: false

    - name: Mostrar resultados de verificación
      ansible.builtin.debug:
        msg: |
          {{ time_status.stdout }}
          {{ ntp_sources.stdout }}

Variables

El playbook utiliza una variable principal:

ntp_server: "0.pool.ntp.org"

Este servidor es el origen de tiempo para todos los nodos destino definidos por target_hosts.

Flujo de Ejecución

1. Verificación de paquetes instalados

Se determina si ntp o chrony están instalados usando el comando rpm -q:

- name: Verificar si NTP está instalado
shell: rpm -q ntp

- name: Verificar si Chrony está instalado
shell: rpm -q chrony

Ambas tareas permiten errores con ignore_errors: true.

2. Instalación de NTP (si es necesario)

Si ninguno de los dos servicios está presente, se instala ntp:

when: ntp_installed.rc != 0 and chrony_installed.rc != 0

3. Configuración de NTP

Si ntp está presente (o fue instalado), se configura el archivo /etc/ntp.conf:

  • Se comentan las líneas server existentes.
  • Se añade el servidor NTP definido.
  • Se insertan restricciones de acceso.
  • Se habilita y reinicia el servicio ntpd.

4. Configuración de Chrony (solo si NTP no está)

Si chrony está instalado y ntp no lo está:

  • Se comentan las líneas server y pool.
  • Se añade el servidor ntp_server.
  • Se reinicia y habilita chronyd.

Este comportamiento garantiza una única fuente de sincronización activa, evitando conflictos entre ambos demonios.

5. Verificación del estado de sincronización

Finalmente, se verifican:

  • El estado del sistema con timedatectl status.
  • Las fuentes de sincronización activas mediante ntpq o chronyc.

Estos resultados se presentan con debug para su revisión:

- name: Mostrar resultados de verificación
debug:
msg: |
{{ time_status.stdout }}
{{ ntp_sources.stdout }}

Ventajas del Enfoque

  • Consistencia: Automatiza la configuración homogénea en múltiples nodos.
  • Flexibilidad: Detecta el entorno actual y actúa en consecuencia.
  • Compatibilidad: Funciona tanto en sistemas con ntp como con chrony.

Consideraciones

  • Requiere privilegios de superusuario (become: true).
  • Es recomendable asegurar la disponibilidad del servidor NTP interno.
  • No incluye configuración de cortafuegos o puertos (ej. UDP 123).

Conclusión

El uso de Ansible para la configuración de la sincronización horaria en sistemas RedHat/CentOS proporciona una solución escalable, coherente y fácilmente mantenible. Este playbook garantiza que todos los nodos estén sincronizados correctamente, con prioridad a NTP como solución preferida. Esta práctica resulta especialmente útil en entornos corporativos con control de infraestructura de tiempo interno.

Binario 0
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.