ansible 配合 logrotate 是最稳、最易落地的批量管理方案,通过版本化配置、严格权限控制、dateext/dateyesterday 启用、sharedscripts 和 kill -usr1 信号实现统一、兼容、可验证的日志轮转。

统一配置:logrotate 文件即代码
所有服务器必须使用同一份 /etc/logrotate.d/nginx 配置,不能手工改。这份文件要满足几个硬性要求:
- 路径固定,logrotate 只扫描
/etc/logrotate.d/下的文件 - 权限严格设为
644,属主属组为root:root - 启用
dateext和dateyesterday,归档名才准确(如access.log-2026-09-03) - 必须含
sharedscripts,避免多个日志文件重复触发 reload -
postrotate中用kill -USR1 $(cat $PID_FILE),不依赖 systemd 或 nginx -s,兼容容器、OpenRC 等各种环境
Ansible 批量部署与上线前验证
把 logrotate 配置作为 Ansible Role 的模板或静态文件下发,关键动作包括:
- 用
copy模块推送配置,强制指定owner: root、group: root、mode: '0644' - 用
command模块执行logrotate -d /etc/logrotate.d/nginx,检查语法和路径是否合法 - 加一个
assert任务,确认/var/run/nginx.pid可读,且postrotate里能成功解析出 PID - 灰度节点上先跑
logrotate -vf /etc/logrotate.d/nginx,观察实际轮转是否成功、Nginx 是否继续写新日志
适配不同环境的弹性设计
真实环境里 Nginx 安装路径、日志位置、实例数量都不一样,配置需留出变量接口:
- 在 Ansible 变量中定义
nginx_log_dir: /var/log/nginx和nginx_pid_file: /var/run/nginx.pid,按集群或角色覆盖 - logrotate 配置中用通配符
{{ nginx_log_dir }}/*.log,或渲染成具体路径如/usr/local/nginx/logs/*.log - 若存在多个 Nginx 实例(比如标准版 + OpenResty),就分别建
/etc/logrotate.d/nginx-main和/etc/logrotate.d/openresty,避免信号误发导致服务抖动
配套监控闭环:及时发现失效节点
配置发下去只是开始,还得知道它有没有真干活:
- 用 Prometheus + node_exporter 监控
/var/log/nginx/目录下最大文件大小、文件数、磁盘使用率 - Grafana 中设置告警规则:如果某台机器连续 24 小时没生成带日期后缀的新日志(如
access.log-2026-09-03),说明 logrotate 失效或 Nginx 没收到 USR1 信号 - 可搭配 Ansible Playbook 写个巡检任务,定期拉取各节点
logrotate.status时间戳做比对











