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:
- Detectar si los paquetes
chrony
ontp
están instalados. - Instalar
chrony
si no hay ningún cliente horario presente. - Configurar correctamente
chrony
(ontp
en su defecto) para usar un servidor horario corporativo. - Reiniciar y habilitar el servicio correspondiente.
- Mostrar el estado de la hora del sistema y las fuentes horarias activas.
Variables Utilizadas
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:
---
- 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
yserver
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.