Skip to content

Deprecated — Consolidated into PLAT-0004 on 2026-05-02 per ADR-0047. This source file is retained as a reference; the canonical content is in PLAT-0004.

ADR-0019: systemd-timesyncd over chrony for Ubuntu 25.10+

Status

Accepted — 2026-04-02

Context

Ubuntu 25.10 (Questing Quokka) ships systemd-timesyncd as the sole default NTP implementation. chrony is no longer installed by default and is not present in the minimal install. The Ansible common role's ntp.yml task file was previously a stub — NTP was never configured, leaving nodes without time synchronisation on fresh deploys.

During the v0.4 baseline run against caneast-site1-node3 (Ubuntu 25.10), it was confirmed that: - chrony had been manually installed at some point and was present on the node - systemd-timesyncd was absent - The systemd-timesyncd service could not be started until the package was explicitly installed

On Ubuntu < 25.10, both chrony and systemd-timesyncd can coexist, but they conflict when both are active. The platform standardises on systemd-timesyncd for simplicity and to align with Ubuntu upstream defaults.

Decision

All Archon nodes running Ubuntu >= 25.10 use systemd-timesyncd for NTP.

  • chrony is purged if present (Ubuntu >= 25.10 only — conditional on distribution version)
  • systemd-timesyncd package is explicitly installed before the service is enabled
  • NTP servers are configured via /etc/systemd/timesyncd.conf using the timesyncd.conf.j2 template
  • NTP server list is defined in common_ntp_servers (defaults: time.nrc.ca, time.chu.nrc.ca, ca.pool.ntp.org)

Template — timesyncd.conf.j2

[Time]
NTP={{ common_ntp_servers | join(' ') }}
FallbackNTP=pool.ntp.org
RootDistanceMaxSec=5
PollIntervalMinSec=32
PollIntervalMaxSec=2048

Alternatives Considered

chrony — Dropped from Ubuntu 25.10 default install. Would require explicit installation and management. More capable than timesyncd but unnecessary complexity for this use case.

ntpd — Legacy. Not present in Ubuntu 25.10 default repos. Higher overhead than timesyncd.

No NTP configuration — Prior state (stub task file). Unacceptable for a production baseline — clock drift causes TLS failures, log correlation issues, and Infisical token validation errors.

Consequences

  • The systemd-timesyncd package must be installed before the service is enabled — this is now explicit in ntp.yml
  • Chrony purge is version-gated (ansible_distribution_version is version('25.10', '>=')) to avoid breaking older nodes
  • All future Ubuntu nodes should be on 25.10+ — the platform is aligned with the upstream default
  • handlers/main.yml retains only the Restart timesyncd handler; the chrony handler was removed

References

  • ansible/roles/common/tasks/ntp.yml
  • ansible/roles/common/templates/timesyncd.conf.j2
  • Ubuntu 25.10 release notes (systemd-timesyncd as default NTP)
  • PR #20: fix: common role Ubuntu 25.10 compatibility