如何自动清理Ansible copy、template模块生成的备份文件并保留指定份数?
Ansible自动清理备份文件方案
Ansible的copy、template等模块开启backup: yes参数后,会在目标文件所在目录生成带时间戳后缀的备份文件,可直接通过Ansible原生模块组合实现自动清理、仅保留指定份数备份的需求,无需额外依赖第三方工具。
可直接复用的Playbook示例
以下示例默认保留最近3份备份,可通过变量自定义规则:
--- - name: 配置更新+旧备份自动清理 hosts: 你的目标主机组 vars: # 目标配置文件路径 target_file: /etc/nginx/nginx.conf # 要保留的最近备份份数 keep_backup_num: 3 tasks: # 第一步:更新配置并生成备份(copy模块用法完全一致) - name: 渲染生成新配置文件 ansible.builtin.template: src: templates/nginx.conf.j2 dest: "{{ target_file }}" backup: yes register: config_update_result # 第二步:查询所有对应备份文件 - name: 按修改时间倒序获取所有备份文件列表 ansible.builtin.find: paths: "{{ target_file | dirname }}" patterns: "{{ target_file | basename }}.*~" sort: yes order: lastmodified register: backup_file_list # 第三步:清理超出保留份数的旧备份 - name: 删除多余的历史备份 ansible.builtin.file: path: "{{ item.path }}" state: absent loop: "{{ backup_file_list.files[:-keep_backup_num] }}" when: backup_file_list.files | length > keep_backup_num
逻辑说明
- 备份文件默认命名规则为
原文件名.时间戳~,find模块会匹配所有对应文件的备份,按修改时间倒序排列,最新的备份排在列表末尾 - 列表切片
[:-keep_backup_num]会筛选出除了最后N个(最新N份)之外的所有旧备份执行删除 - 仅当备份总数大于要保留的份数时才会执行删除操作,避免备份数不足时报错
注意事项
- 如果你的备份文件统一存放在独立目录,只需调整find模块的
paths参数为备份目录路径,patterns参数适配你需要清理的文件匹配规则即可 - 首次执行前可以把file模块替换为debug模块打印待删除的文件路径,确认规则符合预期后再执行删除操作,避免误删
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

