Automatizar mediante Ansible la verificación, instalación y configuración del servicio de sincronización horaria en sistemas basados en Debian/Ubuntu. El playbook considera si están presentes los servicios Chrony o NTP, configurando uno u otro en función del estado del sistema.
Descripción de tareas
- Verificación de servicios instalados:
- Se comprueba si
chrony
yntp
están instalados usando comandosdpkg
.
- Se comprueba si
- Instalación condicional:
- Si ninguno está instalado, se instala
ntp
.
- Si ninguno está instalado, se instala
- Configuración de servicio de tiempo:
- Si
ntp
está presente, se edita el fichero/etc/ntp.conf
para:- Comentar líneas de servidores previas.
- Añadir un nuevo servidor.
- Añadir restricciones de seguridad.
- Habilitar y reiniciar el servicio.
- Si
chrony
está instalado:- Se comentan entradas
pool
yserver
en/etc/chrony/chrony.conf
. - Se añade el nuevo servidor.
- Se reinicia y habilita el servicio.
- Se comentan entradas
- Si
- Verificación de estado:
- Se muestran el estado actual de sincronización (
timedatectl
) y las fuentes de tiempo (ntpq
ochronyc
).
- Se muestran el estado actual de sincronización (
Requisitos previos
- Ansible instalado en el nodo de control.
- Acceso root o sudo sin contraseña en los nodos gestionados.
- Variable
ntp_server
definida (por ejemplo,ntp_server: "0.pool.ntp.org"
).
Código YAML del playbook
---
- name: Configurar sincronización horaria con NTP o Chrony
hosts: all
become: yes
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 NTP si no está instalado ni Chrony
ansible.builtin.apt:
name: ntp
state: present
when: ntp_installed.rc != 0 and chrony_installed.rc != 0
- name: Configurar NTP
when: ntp_installed.rc == 0 or (ntp_installed.rc != 0 and chrony_installed.rc != 0)
block:
- name: Comentar servidores existentes en ntp.conf
ansible.builtin.replace:
path: /etc/ntp.conf
regexp: '^server'
replace: '#server'
- 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: Configurar Chrony
when: chrony_installed.rc == 0
block:
- name: Comentar servidores pool y server en chrony.conf
ansible.builtin.replace:
path: /etc/chrony/chrony.conf
regexp: '^(pool|server)'
replace: '#\1'
- 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: 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: |
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 }}
Resultado esperado
Al finalizar la ejecución del playbook:
- Tendrás uno de los dos servicios de sincronización activos (Chrony o NTP).
- El sistema estará configurado para utilizar el servidor definido en
ntp_server
. - Verás en pantalla el estado de sincronización y las fuentes NTP activas.