Icono del sitio Binario 0

Configuración Automatizada de la Sincronización Horaria en RedHat/CentOS con Ansible

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

  1. Detectar si el sistema tiene instalado ntp o chrony.
  2. Instalar ntp si ninguno está presente.
  3. Configurar ntp si está presente o ha sido instalado.
  4. Configurar chrony sólo si está presente y ntp no lo está.
  5. 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:

4. Configuración de Chrony (solo si NTP no está)

Si chrony está instalado y ntp no lo está:

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:

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

Consideraciones

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.

Salir de la versión móvil