Ansible脚本查找最近1天编辑文件并移动时报错求助
Ansible脚本错误分析与修正
让我帮你梳理下你遇到的问题,你的Ansible脚本有几个关键错误导致了报错,我们一个个来看:
1. Task语法结构错误
你第一个任务的写法完全不符合Ansible的YAML语法规范,把任务名称和find模块混在了同一行,参数也没有正确缩进。Ansible的每个任务应该是清晰的结构:任务名称单独一行,然后是模块名称,再缩进模块的参数。
2. age参数使用错误
你写的age: 1d是告诉find模块查找修改时间超过1天的文件,但你的需求是最近1天编辑过的,正确的写法应该是age: -1d(负数表示“在指定时间范围内”的文件)。
3. 注册变量引用错误
你注册的files变量是一个包含查找结果的对象,实际的文件列表存在files.files这个数组里,每个元素的path字段才是文件的完整路径。你直接用~/{{files}}会把整个对象转换成字符串,自然找不到对应的文件路径。
4. copy模块的参数缺失
即使你引用了正确的文件路径,copy模块默认会从控制机(运行Ansible的机器)查找源文件,而不是远程的Redhat主机,所以必须加上remote_src: yes参数来指定源文件在远程主机上。另外,如果你是要移动文件而不是复制,用copy之后还需要删除原文件,或者直接用mv命令更高效。
修正后的完整脚本
下面是满足你需求的正确脚本,这里提供两种实现方式:
方式一:使用copy+file模块(先复制再删除原文件)
- name: Find files edited in the last 1 day under /software find: path: /software recurse: yes file_type: file age: -1d # 查找最近1天内修改的文件 register: found_files - name: Copy found files to /tmp directory copy: src: "{{ item.path }}" dest: "/tmp/{{ item.path | basename }}" # 只保留文件名,避免在/tmp下创建嵌套目录 remote_src: yes # 指定源文件在远程主机上 loop: "{{ found_files.files }}" when: found_files.files | length > 0 # 当没有找到文件时跳过任务 - name: Delete original files after copying file: path: "{{ item.path }}" state: absent loop: "{{ found_files.files }}" when: found_files.files | length > 0
方式二:直接使用command模块执行mv命令(更高效的移动操作)
- name: Find files edited in the last 1 day under /software find: path: /software recurse: yes file_type: file age: -1d register: found_files - name: Move found files to /tmp directory command: mv "{{ item.path }}" /tmp/ loop: "{{ found_files.files }}" when: found_files.files | length > 0
内容的提问来源于stack exchange,提问作者ofek ofek
相关产品推荐
相关产品推荐

