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

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

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

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 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.

Binario 0
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.