# Configuración de Sincronización Horaria en Sistemas Linux Usando Ansible, Prioridad a Chrony

- Link: https://binariocero.com/ansible/configuracion-de-sincronizacion-horaria-en-sistemas-linux-usando-ansible-prioridad-a-chrony
- Published: 2025-07-27T13:27:32+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 precisa del tiempo en los sistemas informáticos es esencial para
el correcto funcionamiento de servicios, registros de auditoría, tareas programadas
y protocolos de red. En entornos corporativos, es una práctica habitual centralizar
la fuente horaria mediante servidores NTP (Network Time Protocol).

Este artículo describe un _playbook_ de Ansible diseñado para automatizar la configuración
de la sincronización horaria en sistemas Linux, dando prioridad al uso del cliente**
Chrony** sobre el tradicional **NTP**. Se adapta dinámicamente a la presencia o 
ausencia de cada uno, y configura el sistema con el servidor horario corporativo
correspondiente.

## Objetivo del Playbook

El propósito de este _playbook_ es:

 1. Detectar si los paquetes `chrony` o `ntp` están instalados.
 2. Instalar `chrony` si no hay ningún cliente horario presente.
 3. Configurar correctamente `chrony` (o `ntp` en su defecto) para usar un servidor
    horario corporativo.
 4. Reiniciar y habilitar el servicio correspondiente.
 5. Mostrar el estado de la hora del sistema y las fuentes horarias activas.

## Variables Utilizadas

    ```wp-block-preformatted
    vars:  ntp_server: "0.pool.ntp.org"
    ```

Se define una variable `ntp_server` con el nombre del servidor horario interno de
la organización.

## Estructura del Playbook

A continuación se presenta el contenido completo del _playbook_:

    ```wp-block-preformatted
    ---- name: Configurar sincronización horaria priorizando Chrony  hosts: "{{ target_hosts }}"  become: true  vars:    ntp_server: "0.pool.ntp.org"  tasks:    - name: Verificar si Chrony está instalado      ansible.builtin.shell: dpkg -l | grep -qw chrony      register: chrony_installed      ignore_errors: true    - name: Verificar si NTP está instalado      ansible.builtin.shell: dpkg -l | grep -qw ntp      register: ntp_installed      ignore_errors: true    - name: Instalar Chrony si no hay ningún cliente NTP      ansible.builtin.apt:        name: chrony        state: present        update_cache: yes      when: chrony_installed.rc != 0 and ntp_installed.rc != 0    - name: Configurar Chrony si está presente      when: chrony_installed.rc == 0 or (chrony_installed.rc != 0 and ntp_installed.rc != 0)      block:        - name: Comentar líneas pool y server en chrony.conf          ansible.builtin.replace:            path: /etc/chrony/chrony.conf            regexp: '^(pool|server)'            replace: '#\1'          ignore_errors: true        - name: Añadir nuevo servidor Chrony          ansible.builtin.lineinfile:            path: /etc/chrony/chrony.conf            line: "server {{ ntp_server }} iburst"            insertafter: EOF        - name: Habilitar y reiniciar servicio Chrony          ansible.builtin.service:            name: chrony            state: restarted            enabled: yes    - name: Configurar NTP si está instalado pero no Chrony      when: chrony_installed.rc != 0 and ntp_installed.rc == 0      block:        - name: Comentar líneas server 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 NTP          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: ntp            state: restarted            enabled: yes    - name: Mostrar estado de la hora del sistema      ansible.builtin.shell: timedatectl status      register: time_status      changed_when: false    - name: Mostrar fuentes NTP/Chrony      ansible.builtin.shell: |        chronyc tracking 2>/dev/null || ntpq -p      register: ntp_sources      changed_when: false    - name: Mostrar resultados de verificación      ansible.builtin.debug:        msg: |          {{ time_status.stdout }}          {{ ntp_sources.stdout }}
    ```

## Comportamiento del Playbook

### 1. **Detección de clientes instalados**

Usa comandos `dpkg -l` para comprobar si están presentes los paquetes `chrony` y`
ntp`, registrando los resultados para condicionar los siguientes pasos.

### 2. **Instalación condicional**

Si no hay ningún cliente instalado, instala `chrony`, aprovechando su mejor precisión
y tiempos de convergencia en comparación con `ntp`.

### 3. **Configuración de Chrony**

Si `chrony` está disponible o ha sido recién instalado:

 * Se comentan las líneas `pool` y `server` existentes.
 * Se añade el servidor corporativo con la opción `iburst` para una sincronización
   inicial rápida.
 * Se habilita y reinicia el servicio.

### 4. **Configuración alternativa con NTP**

Si `ntp` está presente pero no `chrony`:

 * Se modifica el archivo `/etc/ntp.conf`, comentando servidores anteriores y añadiendo
   el nuevo.
 * Se aplican restricciones de seguridad.
 * Se habilita y reinicia el servicio.

### 5. **Verificación final**

Se muestra el estado de la hora del sistema (`timedatectl`) y las fuentes activas(`
chronyc tracking` o `ntpq -p`), lo que permite validar que la configuración se ha
aplicado correctamente.

## Conclusión

Este _playbook_ es una solución automatizada y eficiente para gestionar la sincronización
horaria en entornos Linux, priorizando `chrony` como cliente moderno y confiable.
Puede integrarse fácilmente en pipelines de CI/CD, procesos de aprovisionamiento
de infraestructura o tareas recurrentes de mantenimiento.

El diseño adaptable garantiza que los sistemas queden correctamente configurados,
independientemente del cliente NTP previamente instalado.
