Ansible win_file模块删除变量存储文件失败求助
问题分析与解决
我一眼就发现问题所在了——你的win_file模块里对win_find返回结果的引用方式有误,导致生成的文件路径根本不存在,所以模块执行时没有实际删除任何文件。
核心问题拆解
win_find模块返回的result.files是一个字典列表,每个字典元素包含了匹配到的文件的完整信息(比如path、ctime、size等)。而你当前的写法:
path: "{{ web_backup_dir }}\\{{ item }}"
相当于把整个文件字典对象直接拼接到路径后面,生成的路径格式会是类似C:\backup\{'path': 'C:\backup\file1.bak', 'ctime': ...}这种完全无效的路径,自然找不到要删除的文件,所以win_file模块只会返回ok但changed: false。
修正后的Playbook
你不需要手动拼接路径,直接使用item.path就能拿到匹配文件的完整路径,同时可以优化when条件的写法(Ansible的when子句里不需要用{{ }}包裹表达式):
- name: Find files older than 30d win_find: paths: "{{ web_backup_dir }}" age: 2592000 age_stamp: ctime register: result # Delete matched files - win_file: path: "{{ item.path }}" state: absent when: result.matched != 0 with_items: "{{ result.files }}"
额外验证小技巧
如果你想确认路径是否正确,可以先添加一个debug任务打印item.path的值,验证是否是你预期的文件路径:
- debug: msg: "Will delete file: {{ item.path }}" with_items: "{{ result.files }}" when: result.matched != 0
另外当result.matched为0时,with_items会自动跳过这个任务,所以when条件其实也可以省略,不过保留它能让逻辑更清晰。
内容的提问来源于stack exchange,提问作者Dam
相关产品推荐
相关产品推荐

