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

- Link: https://binariocero.com/ansible/configuracion-automatizada-de-la-sincronizacion-horaria-en-redhat-centos-con-ansible
- Published: 2025-07-27T13:31:10+02:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

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.

    ```wp-block-code
    ---
    - 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:

    ```wp-block-preformatted
    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`:

    ```wp-block-preformatted
    - 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`:

    ```wp-block-preformatted
    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:

    ```wp-block-preformatted
    - 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.
