Ansible使用archive模块打包多文件问题:仅打包列表最后元素如何解决
搞定Ansible Archive只打包最后一个文件的问题
嘿,我知道你现在遇到的麻烦——用find找到超过1天的旧文件,结果用archive打包时只留下了最后一个文件对吧?这大概率是因为你可能在循环里调用archive,每次打包单个文件时都覆盖了之前的归档包,最后当然只剩最后一个啦。下面给你说怎么正确实现一次性打包所有符合条件的文件:
正确的Playbook示例
直接上能跑的代码,你替换成自己的路径就行:
- name: 归档超过1天的旧文件 hosts: 你的目标主机组 gather_facts: yes tasks: - name: 找出所有超过1天的旧文件 ansible.builtin.find: paths: "/你要查找的目录路径" age: 1d recurse: no # 如果要递归找子目录就改成yes file_type: file register: old_files_list - name: 没找到文件时提示一下 ansible.builtin.debug: msg: "哦豁,没找到超过1天的旧文件~" when: old_files_list.files | length == 0 - name: 把所有符合条件的文件打包成tar.gz ansible.builtin.archive: path: "{{ old_files_list.files | map(attribute='path') | list }}" dest: "/你要保存归档的路径/old_files.tar.gz" format: gz owner: 你的用户名 # 可选,设置归档的所有者 group: 你的用户组 # 可选,设置归档的所属组 mode: '0644' # 可选,设置归档的权限 when: old_files_list.files | length > 0
关键要点解释
处理find的结果:
find模块返回的old_files_list.files是个字典列表,每个字典里的path就是文件的完整路径。我们用map(attribute='path')把所有路径提取出来,再转成列表,这样就能一次性把所有文件路径传给archive的path参数。别循环调用archive!
千万不要用loop去遍历每个文件然后单独打包——每次打包都会生成新的归档,覆盖之前的,最后肯定只剩最后一个文件。一次性把所有路径传进去,archive会自动把所有文件塞进同一个tar.gz里。加个条件判断更稳妥
加个when条件,只有找到文件的时候才执行归档,避免没文件的时候白跑一趟还可能报错。
小提醒
- 要是目标目录文件多或者路径有特殊字符,记得调整find的参数(比如recurse要不要开,要不要加patterns过滤文件名)。
- 归档保存的路径要确保Ansible执行用户有写入权限哦!
内容的提问来源于stack exchange,提问作者Alvaro Niño
相关产品推荐
相关产品推荐

