# Configuración Automática de la Sincronización Horaria en Sistemas RedHat/CentOS usando Ansible

- Link: https://binariocero.com/ansible/configuracion-automatica-de-la-sincronizacion-horaria-en-sistemas-redhat-centos-usando-ansible
- Published: 2025-07-27T13:36:51+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 en sistemas Linux es fundamental para el correcto
funcionamiento de servicios distribuidos, autenticación, registros de logs y más.
En entornos empresariales, especialmente donde múltiples servidores interactúan 
entre sí, una desviación mínima en el tiempo puede provocar errores de seguridad,
inconsistencias en los datos o fallos en la ejecución de tareas programadas.

Este artículo presenta un **playbook de Ansible** que automatiza la configuración
de la sincronización horaria en sistemas RedHat y CentOS, priorizando el uso de **
Chrony**, el cliente NTP moderno recomendado por Red Hat, pero manteniendo compatibilidad
con el cliente NTP clásico si Chrony no está disponible.

## Objetivos del Playbook

 * Detectar automáticamente si está instalado Chrony o NTP.
 * Instalar Chrony si no hay ningún cliente NTP disponible.
 * Configurar el servidor NTP interno de la organización.
 * Garantizar que el servicio de sincronización esté activo y habilitado.
 * Mostrar información del estado horario y las fuentes de sincronización.

## Detalles Técnicos

### Variables

 * `target_hosts`: Define el grupo de hosts objetivo sobre los que se aplicará la
   configuración.
 * `ntp_server`: Dirección del servidor NTP corporativo, en este caso `0.pool.ntp.
   org`.

### Lógica del Playbook

 1. **Detección de clientes NTP**: Se ejecutan comandos `rpm -q` para comprobar si 
    Chrony o NTP están instalados.
 2. **Instalación Condicional**: Si no hay ninguno de los dos, se instala Chrony mediante`
    yum`.
 3. **Configuración de Chrony**:
 4.  * Se comentan todas las líneas `pool` o `server` existentes en `/etc/chrony.conf`.
     * Se añade la línea `server <ntp_server> iburst` al final del archivo.
     * Se asegura que el servicio `chronyd` esté habilitado y reiniciado.
 5. **Configuración alternativa con NTP**:
 6.  * Solo si Chrony no está disponible pero NTP sí.
     * Se modifican las líneas del archivo `/etc/ntp.conf`.
     * Se introducen restricciones básicas para mejorar la seguridad.
     * Se habilita y reinicia el servicio `ntpd`.
 7. **Verificaciones finales**:
 8.  * Se obtiene el estado horario mediante `timedatectl`.
     * Se muestran las fuentes de sincronización actuales, utilizando `chronyc tracking`
       o `ntpq -p`, según corresponda.
     * Se imprimen los resultados con `debug`.

## Ventajas del Enfoque

 * **Adaptabilidad**: Compatible con sistemas que tengan Chrony o NTP.
 * **Seguridad**: Incluye configuraciones de restricción para proteger el servicio
   NTP.
 * **Automatización Completa**: No requiere intervención manual.
 * **Auditoría Transparente**: Muestra el estado final de la sincronización.

## Código del Playbook

A continuación, se presenta el contenido completo del playbook Ansible:

    ```wp-block-preformatted
    ---- name: Configurar sincronización horaria en RedHat/CentOS (prioriza Chrony)  hosts: "{{ target_hosts }}"  become: true  vars:    ntp_server: "0.pool.ntp.org"  tasks:    - name: Verificar si Chrony está instalado      ansible.builtin.shell: rpm -q chrony      register: chrony_installed      ignore_errors: true    - name: Verificar si NTP está instalado      ansible.builtin.shell: rpm -q ntp      register: ntp_installed      ignore_errors: true    - name: Instalar Chrony si no hay ningún cliente NTP      ansible.builtin.yum:        name: chrony        state: present      when: chrony_installed.rc != 0 and ntp_installed.rc != 0    - name: Configurar Chrony si está presente o se ha instalado      when: chrony_installed.rc == 0 or (chrony_installed.rc != 0 and ntp_installed.rc != 0)      block:        - name: Comentar servidores pool y server en chrony.conf          ansible.builtin.replace:            path: /etc/chrony.conf            regexp: '^(pool|server)'            replace: '#\1'          ignore_errors: true        - name: Añadir nuevo servidor Chrony          ansible.builtin.lineinfile:            path: /etc/chrony.conf            line: "server {{ ntp_server }} iburst"            insertafter: EOF        - name: Habilitar y reiniciar servicio Chrony          ansible.builtin.service:            name: chronyd            state: restarted            enabled: yes    - name: Configurar NTP si está presente pero no Chrony      when: chrony_installed.rc != 0 and ntp_installed.rc == 0      block:        - name: Comentar servidores existentes en ntp.conf          ansible.builtin.replace:            path: /etc/ntp.conf            regexp: '^server'            replace: '#server'          ignore_errors: true        - name: Añadir nuevo servidor NTP          ansible.builtin.lineinfile:            path: /etc/ntp.conf            line: "server {{ ntp_server }} iburst"            insertafter: EOF        - name: Añadir restricciones a ntp.conf          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 servicio NTP          ansible.builtin.service:            name: ntpd            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: |        chronyc tracking 2>/dev/null || ntpq -p      register: ntp_sources      changed_when: false    - name: Mostrar resultados de sincronización      ansible.builtin.debug:        msg: |          {{ time_status.stdout }}          {{ ntp_sources.stdout }}
    ```

## Conclusión

Este playbook es una solución eficaz y flexible para asegurar una sincronización
horaria coherente en entornos RedHat/CentOS. Gracias a su lógica condicional, adapta
su comportamiento según el cliente NTP disponible, lo que lo convierte en una herramienta
ideal para infraestructuras heterogéneas.
