Ansible批量部署chrony实现NTP时间同步:先安装chrony包,再替换/etc/chrony.conf配置上游时间源,最后启用并启动chronyd服务;优先选用chrony而非ntpd,因其在CentOS 7.6+/RHEL 8-9中默认集成、启动快、支持离线补偿。

直接用 Ansible 批量开启 NTP 服务并同步网络时间,核心是两件事:统一安装配置 NTP(或更现代的 chrony),再确保服务启用、配置生效、时间校准成功。不推荐混合使用 ntpdate 和 ntpd,也不建议仅靠 crontab 调用 ntpdate——它无法平滑校时,还可能被 systemd 或 SELinux 干扰。
确认用 ntp 还是 chrony
CentOS 7.6+、RHEL 8/9 及主流云镜像默认已弃用 ntpd,转而使用 chronyd——它启动快、资源占用低、对虚拟机漂移适应更好,且原生支持离线补偿和网络抖动抑制。除非有强兼容要求(如老旧监控系统依赖 ntpq 输出),否则优先批量部署 chrony:
- chrony 包名通常是
chrony,服务名是chronyd - 配置文件路径为
/etc/chrony.conf,比 ntp.conf 更简洁 - 验证命令用
chronyc tracking和chronyc sources -v,比 ntpq 更直观
Ansible 批量安装与配置 chrony
写一个简单 playbook(例如 setup-ntp.yml),指定上游时间源(如阿里云、华为云或内网 NTP 服务器):
- name: 批量部署 chrony 时间同步
hosts: all
become: true
vars:
ntp_servers:
- "time1.aliyun.com iburst"
- "time2.aliyun.com iburst"
- "192.168.0.100 iburst prefer" # 内网主时间源,加 prefer 表示优先选用
tasks:
- name: 安装 chrony
yum:
name: chrony
state: present
<pre class="brush:php;toolbar:false;">- name: 替换 chrony 配置文件
copy:
content: |
pool {{ item }} minpoll 4 maxpoll 6
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
dest: /etc/chrony.conf
owner: root
group: root
mode: '0644'
loop: "{{ ntp_servers }}"
- name: 启用并启动 chronyd
systemd:
name: chronyd
enabled: true
state: started
daemon_reload: true
运行:ansible-playbook setup-ntp.yml -i inventory.ini
快速验证是否同步成功
部署后别只看服务状态,要确认实际时间已收敛:
- 执行
ansible all -m shell -a "chronyc tracking | grep -E 'System clock|Last offset'",检查Last offset是否在 ±50ms 内 - 查源状态:
ansible all -m shell -a "chronyc sources -v | head -10",看到^*标记表示正在使用的主源 - 若发现 offset 偏差大(如 >1s),可加一步强制校准:
ansible all -m shell -a "chronyc makestep"
特殊情况处理:必须用 ntpd 的场景
如客户环境硬性要求 ntpd(比如对接某些金融中间件),则需注意三点:
- 停用 chronyd:
systemctl stop chronyd && systemctl disable chronyd - 配置
/etc/ntp.conf时,restrict规则要放开客户端网段,server行末加iburst - 启动前先手动同步一次:
ntpdate -s [server],避免 ntpd 因偏差过大拒绝启动(默认限制 1000 秒)
不复杂但容易忽略











