# Configuración de sincronización horaria con NTP o Chrony en sistemas Linux usando Ansible

- Link: https://binariocero.com/ansible/configuracion-de-sincronizacion-horaria-con-ntp-o-chrony-en-sistemas-linux-usando-ansible
- Published: 2025-07-26T13:21:46+02:00
- Author: Juan José Fernández Durán

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

Automatizar mediante Ansible la verificación, instalación y configuración del servicio
de sincronización horaria en sistemas basados en Debian/Ubuntu. El playbook considera
si están presentes los servicios **Chrony** o **NTP**, configurando uno u otro en
función del estado del sistema.

### Descripción de tareas

 1. **Verificación de servicios instalados:**
 2.  * Se comprueba si `chrony` y `ntp` están instalados usando comandos `dpkg`.
 3. **Instalación condicional:**
 4.  * Si **ninguno** está instalado, se instala `ntp`.
 5. **Configuración de servicio de tiempo:**
 6.  * Si `ntp` está presente, se edita el fichero `/etc/ntp.conf` para:
        - Comentar líneas de servidores previas.
        - Añadir un nuevo servidor.
        - Añadir restricciones de seguridad.
        - Habilitar y reiniciar el servicio.
     * Si `chrony` está instalado:
        - Se comentan entradas `pool` y `server` en `/etc/chrony/chrony.conf`.
        - Se añade el nuevo servidor.
        - Se reinicia y habilita el servicio.
 7. **Verificación de estado:**
 8.  * Se muestran el estado actual de sincronización (`timedatectl`) y las fuentes
       de tiempo (`ntpq` o `chronyc`).

### Requisitos previos

 * Ansible instalado en el nodo de control.
 * Acceso root o sudo sin contraseña en los nodos gestionados.
 * Variable `ntp_server` definida (por ejemplo, `ntp_server: "0.pool.ntp.org"`).

### Código YAML del playbook

    ```wp-block-preformatted
    ---- name: Configurar sincronización horaria con NTP o Chrony  hosts: all  become: yes  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 NTP si no está instalado ni Chrony      ansible.builtin.apt:        name: ntp        state: present      when: ntp_installed.rc != 0 and chrony_installed.rc != 0    - name: Configurar NTP      when: ntp_installed.rc == 0 or (ntp_installed.rc != 0 and chrony_installed.rc != 0)      block:        - name: Comentar servidores existentes en ntp.conf          ansible.builtin.replace:            path: /etc/ntp.conf            regexp: '^server'            replace: '#server'        - 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: Configurar Chrony      when: chrony_installed.rc == 0      block:        - name: Comentar servidores pool y server en chrony.conf          ansible.builtin.replace:            path: /etc/chrony/chrony.conf            regexp: '^(pool|server)'            replace: '#\1'        - 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: 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: |        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 }}
    ```

### Resultado esperado

Al finalizar la ejecución del playbook:

 * Tendrás **uno de los dos servicios de sincronización activos** (Chrony o NTP).
 * El sistema estará configurado para utilizar el servidor definido en `ntp_server`.
 * Verás en pantalla el estado de sincronización y las fuentes NTP activas.
