backup=yes 会自动将目标主机上同名原文件备份为“原文件名.时间戳~”格式(如nginx.conf.2024-05-22@14:32:05~),前提是dest为具体文件路径且执行用户具备读写权限,备份不跨文件系统硬链接,需手动清理旧备份。

Ansible 的 copy 模块启用 backup=yes 参数后,会在目标主机上对将被覆盖的原文件**自动创建带时间戳的备份副本**,这是安全批量更新线上配置文件的关键防护机制。
backup=yes 的实际行为与备份命名规则
当目标路径已存在同名文件且 backup=yes 时,Ansible 会先将原文件重命名为:<原文件名>.<时间戳>(例如:/etc/nginx/nginx.conf.2024-05-22@14:32:05~)
注意:时间戳格式由目标主机本地时区决定,末尾的 ~ 是 Ansible 固定添加的标识符,不可省略或自定义。
确保备份生效的必要前提
-
目标路径必须是具体文件(非目录):若
dest:指向目录(如/etc/myapp/),backup=yes不生效;需明确指定完整文件路径(如/etc/myapp/config.yml) - 执行用户需有源文件读取+目标目录写入权限:否则备份阶段即失败,任务中止
- 不支持跨文件系统硬链接备份:若原文件与 backup 目标不在同一挂载点,Ansible 自动降级为 copy + unlink,不影响功能但略慢
典型安全覆盖配置示例
以下任务会覆盖 /etc/redis/redis.conf,同时保留原文件为 /etc/redis/redis.conf.YYYY-MM-DD@HH:MM:SS~:
- name: 更新 Redis 配置并保留前身
ansible.builtin.copy:
src: files/redis.conf.j2
dest: /etc/redis/redis.conf
backup: yes
owner: redis
group: redis
mode: '0644'
批量操作后的备份清理建议
备份文件不会自动清理,长期运行易堆积。推荐后续增加清理任务(按需):
- 用
find命令定期清理 7 天前的备份:find /etc/redis/ -name "redis.conf.*~" -mtime +7 -delete - 在 playbook 中用
ansible.builtin.shell模块集成清理逻辑,但需评估运维策略是否允许自动删除 - 生产环境建议将备份路径统一挂载到独立日志盘,并监控
*~文件总量

















