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
- Detección de clientes NTP: Se ejecutan comandos
rpm -q
para comprobar si Chrony o NTP están instalados. - Instalación Condicional: Si no hay ninguno de los dos, se instala Chrony mediante
yum
. - Configuración de Chrony:
- Se comentan todas las líneas
pool
oserver
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.
- Se comentan todas las líneas
- Configuración alternativa con NTP:
- 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
.
- Verificaciones finales:
- Se obtiene el estado horario mediante
timedatectl
. - Se muestran las fuentes de sincronización actuales, utilizando
chronyc tracking
ontpq -p
, según corresponda. - Se imprimen los resultados con
debug
.
- Se obtiene el estado horario mediante
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:
---
0.pool.ntp.org
- name: Configurar sincronización horaria en RedHat/CentOS (prioriza Chrony)
hosts: "{{ target_hosts }}"
become: true
vars:
ntp_server: ""
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.