Ansible如何优雅清理模板/文件模块生成的旧备份文件(保留最新3个)
清理Ansible备份文件的优雅方案
当你用Ansible的template、file等模块开启backup: true后,每次文件变更都会在目标目录生成形如原文件名.~数字~的备份文件(数字越大代表备份越新)。时间久了这类文件会堆积,这里提供仅保留最新3个备份的实用解决方案。
方案一:用Ansible原生模块实现(跨平台)
这种方式不依赖目标主机的命令行工具,兼容性更强:
- name: 清理指定文件的旧备份(仅保留最新3个) hosts: all vars: target_file: "/tmp/my_file" # 替换成你的目标文件路径 keep_backups: 3 # 可按需调整保留数量 tasks: - name: 查找所有对应备份文件(按修改时间从旧到新排序) find: path: "{{ target_file | dirname }}" patterns: "{{ target_file | basename }}.~*~" sort: yes order: asc register: backup_files - name: 计算需要删除的旧备份数量 set_fact: backups_to_delete: "{{ backup_files.files | length - keep_backups }}" - name: 删除超出保留数的旧备份 file: path: "{{ item.path }}" state: absent loop: "{{ backup_files.files[:backups_to_delete] }}" when: backups_to_delete > 0
逻辑说明
- 用
find模块精准匹配目标文件的所有备份,按修改时间升序排列(最旧的备份排在列表最前面) - 计算需要删除的数量:总备份数减去要保留的数量,只有当这个值大于0时才执行删除
- 循环删除列表前N个旧备份文件
方案二:用命令行快速实现(依赖主机工具)
如果目标主机是类Unix系统,也可以用一行命令快速处理,适合简单场景:
- name: 用命令行清理备份(仅保留最新3个) hosts: all vars: target_file: "/tmp/my_file" keep_backups: 3 tasks: - name: 执行清理命令 command: > ls -tp {{ target_file | dirname }}/{{ target_file | basename }}.~*~ | grep -v '/$' | tail -n +{{ keep_backups + 1 }} | xargs -I {} rm -- {} args: warn: false when: (lookup('glob', "{{ target_file | dirname }}/{{ target_file | basename }}.~*~", wantlist=True) | length) > keep_backups
逻辑说明
ls -tp按修改时间倒序列出文件,过滤掉目录项tail -n +N跳过前N个最新的备份,剩下的就是要删除的旧备份xargs把这些文件路径传给rm命令完成删除
内容的提问来源于stack exchange,提问作者Kevin C
相关产品推荐
相关产品推荐

