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:
- Detectar si el sistema tiene instalado
ntp
ochrony
. - Instalar
ntp
si ninguno está presente. - Configurar
ntp
si está presente o ha sido instalado. - Configurar
chrony
sólo si está presente yntp
no lo está. - Verificar el estado del servicio de sincronización.
---
- 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:
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
:
- 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
:
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
ypool
. - 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
ochronyc
.
Estos resultados se presentan con debug
para su revisión:
- 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 conchrony
.
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.