# Automatización de la Configuración de Sincronización Horaria en Linux

- Link: https://binariocero.com/linux/automatizacion-de-la-configuracion-de-sincronizacion-horaria-en-linux
- Published: 2025-08-10T12:11:52+02:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

La correcta sincronización horaria en los sistemas Linux es un componente crítico
para garantizar la coherencia en los registros del sistema, la integridad de las
operaciones en red, la autenticación Kerberos, la replicación entre servidores, 
y otras tareas sensibles al tiempo. Este artículo presenta un script Bash que automatiza
la detección, configuración e instalación del servicio de sincronización horaria
en función de la distribución y del servicio ya presente en el sistema.

El script utiliza un servidor NTP genérico (`ntp.empresa.local`), que puede ser 
sustituido fácilmente por uno interno o externo según el entorno del usuario.

    ```wp-block-code
    #!/bin/bash

    set -e

    # === Variables ===
    NTP_SERVER="${NTP_SERVER:-ntp.ejemplo.local}"
    LOGFILE="/var/log/time_sync_config.log"

    # === Función de log ===
    log() {
        local MSG="$1"
        echo "$(date '+%Y-%m-%d %H:%M:%S') - $MSG" | tee -a "$LOGFILE"
    }

    # === Requiere root ===
    check_root() {
        if [[ $EUID -ne 0 ]]; then
            log "Este script debe ejecutarse como root."
            exit 1
        fi
    }

    # === Detectar distribución del sistema operativo ===
    detect_os() {
        if [[ -f /etc/os-release ]]; then
            . /etc/os-release
            OS_ID=$ID
            OS_VERSION=$VERSION_ID
            log "Sistema detectado: $OS_ID $OS_VERSION"
        else
            log "No se pudo detectar el sistema operativo."
            exit 1
        fi
    }

    # === Detectar qué servicio de tiempo está presente ===
    detect_time_service() {
        for svc in chronyd ntpd ntpsec-timesyncd systemd-timesyncd; do
            if systemctl list-unit-files | grep -q "^$svc"; then
                TIME_SERVICE="$svc"
                log "Servicio detectado: $TIME_SERVICE"
                return
            fi
        done

        TIME_SERVICE="none"
        log "No se encontró ningún servicio de tiempo instalado."
    }

    # === Configurar chronyd ===
    configure_chrony() {
        log "Configurando chrony..."
        CONF_FILE="/etc/chrony.conf"
        [[ -f /etc/chrony/chrony.conf ]] && CONF_FILE="/etc/chrony/chrony.conf"

        sed -i 's/^server /# &/' "$CONF_FILE"
        echo "server $NTP_SERVER iburst" >> "$CONF_FILE"

        systemctl enable chronyd
        systemctl restart chronyd
        log "chrony configurado con $NTP_SERVER"
    }

    # === Configurar ntp ===
    configure_ntp() {
        log "Configurando ntp..."
        CONF_FILE="/etc/ntp.conf"

        sed -i 's/^server /# &/' "$CONF_FILE"
        echo "server $NTP_SERVER iburst" >> "$CONF_FILE"

        systemctl enable ntp
        systemctl restart ntp
        log "ntp configurado con $NTP_SERVER"
    }

    # === Configurar ntpsec ===
    configure_ntpsec() {
        log "Configurando ntpsec..."
        CONF_FILE="/etc/ntp.conf"

        sed -i 's/^server /# &/' "$CONF_FILE"
        echo "server $NTP_SERVER iburst" >> "$CONF_FILE"

        systemctl enable ntpsec-timesyncd
        systemctl restart ntpsec-timesyncd
        log "ntpsec configurado con $NTP_SERVER"
    }

    # === Configurar systemd-timesyncd ===
    configure_systemd_timesyncd() {
        log "Configurando systemd-timesyncd..."
        CONF_FILE="/etc/systemd/timesyncd.conf"

        sed -i 's/^NTP=.*/# &/' "$CONF_FILE" || true
        sed -i 's/^#NTP=.*/# &/' "$CONF_FILE" || true
        grep -q "^NTP=" "$CONF_FILE" || echo "NTP=$NTP_SERVER" >> "$CONF_FILE"

        systemctl enable systemd-timesyncd
        systemctl restart systemd-timesyncd
        log "systemd-timesyncd configurado con $NTP_SERVER"
    }

    # === Instalar y configurar ntp si no hay ninguno ===
    install_and_configure_ntp() {
        log "Instalando y configurando ntp..."
        if [[ "$OS_ID" =~ (debian|ubuntu) ]]; then
            apt update -y
            apt install -y ntp
        elif [[ "$OS_ID" =~ (rhel|centos|rocky|almalinux) ]]; then
            yum install -y ntp
        else
            log "Distribución no soportada para instalar ntp."
            exit 1
        fi
        TIME_SERVICE="ntpd"
        configure_ntp
    }

    # === Lógica principal ===
    main() {
        check_root
        detect_os
        detect_time_service

        case "$TIME_SERVICE" in
            chronyd)
                configure_chrony
                ;;
            ntpd)
                configure_ntp
                ;;
            ntpsec-timesyncd)
                configure_ntpsec
                ;;
            systemd-timesyncd)
                configure_systemd_timesyncd
                ;;
            none)
                install_and_configure_ntp
                ;;
            *)
                log "Servicio de tiempo desconocido: $TIME_SERVICE"
                exit 1
                ;;
        esac

        log "Configuración de sincronización horaria completada correctamente."
        log "SUCCESS"
    }

    main
    ```

## Objetivo

Permitir la configuración automática y uniforme del servicio de sincronización horaria
en sistemas Linux, adaptándose dinámicamente a la distribución y al servicio de 
tiempo instalado. En caso de no detectar ninguno, se encargará de instalar y configurar
el servicio `ntp`.

## Servicios Soportados

El script detecta y configura automáticamente los siguientes servicios de sincronización
horaria:

 * `chronyd`
 * `ntpd`
 * `ntpsec-timesyncd`
 * `systemd-timesyncd`

Si no se detecta ninguno, se instala y configura `ntpd` utilizando el gestor de 
paquetes correspondiente.

## Personalización

El script utiliza una variable `NTP_SERVER` que puede ser definida como variable
de entorno, o tomará por defecto el valor `ntp.empresa.local`. Esto permite adaptar
el script a entornos corporativos con servidores NTP internos.

## Funcionamiento del Script

### 1. Requisitos y Comprobaciones Iniciales

 * Verifica que se ejecuta con privilegios de root.
 * Detecta la distribución y versión del sistema operativo.
 * Detecta si ya hay algún servicio de tiempo instalado.

### 2. Configuración por Servicio

Para cada servicio detectado, el script:

 * Comenta las líneas existentes de servidores NTP.
 * Añade el servidor definido (`$NTP_SERVER`).
 * Activa y reinicia el servicio correspondiente.

### 3. Instalación Automática

En caso de no detectarse ningún servicio, se instala `ntp` mediante `apt` o `yum`,
según la distribución.

## Registro de Ejecución

Todas las operaciones se registran en `/var/log/time_sync_config.log` para facilitar
auditoría y resolución de problemas.

## Ejecución del Script

    ```wp-block-preformatted
    sudo ./configurar_ntp.sh
    ```

También puede definirse un servidor NTP personalizado en la ejecución:

    ```wp-block-preformatted
    NTP_SERVER=ntp.midominio.org sudo ./configurar_ntp.sh
    ```

## Ventajas

 * **Automatización completa**: No requiere intervención manual.
 * **Adaptable**: Funciona en distribuciones Debian/Ubuntu y RHEL/CentOS/Rocky/AlmaLinux.
 * **Auditable**: Todo el proceso queda registrado.
 * **Seguridad**: Requiere permisos de root para garantizar cambios efectivos.

## Conclusión

Este script proporciona una solución fiable y extensible para estandarizar la sincronización
horaria en entornos Linux heterogéneos. Ideal para entornos corporativos, despliegues
automatizados y tareas de hardening del sistema.

Para mejorar la precisión o redundancia, puede modificarse el valor de `NTP_SERVER`
para incluir múltiples servidores NTP o usar configuraciones de pools según las 
necesidades específicas de la organización.
