Ansible任务无法删除指定文件,仅标记为OK无实际操作求助
问题分析与修复方案
核心错误:条件判断引用了错误的变量
你在Debug任务里用item not in managed_files.stdout_lines能正确识别非托管文件,但删除任务里写成了item not in managed_files——这里的managed_files是整个shell任务的注册结果对象,不是文件列表数组,所以这个条件永远不成立,导致删除任务根本没执行,只会返回OK。
次要问题:变量引用格式不规范
删除任务里的with_items: zonesdel.stdout_lines缺少双大括号,虽然部分Ansible版本兼容这种写法,但规范起见应该写成with_items: "{{ zonesdel.stdout_lines }}"。
修正后的完整任务代码
- shell: ls -1 /usr/local/ansible/roles/common/templates/etc/named/zones/ register: managed_files become: true - shell: ls -1 /etc/named/zones/ register: zonesdel become: true - name: Debug unmanaged files debug: var: item with_items: "{{ zonesdel.stdout_lines }}" when: item not in managed_files.stdout_lines - name: Remove unmanaged files on remote server file: path: /etc/named/zones/{{ item }} state: absent with_items: "{{ zonesdel.stdout_lines }}" when: item not in managed_files.stdout_lines become: true
优化建议(可选)
用Ansible原生的find模块替代shell: ls获取文件列表更可靠,能避免ls输出格式变化带来的问题,示例如下:
- name: 获取本地托管文件列表 find: path: /usr/local/ansible/roles/common/templates/etc/named/zones/ file_type: file recurse: no register: managed_files become: true - name: 获取远程服务器zones目录文件列表 find: path: /etc/named/zones/ file_type: file recurse: no register: zonesdel become: true - name: 调试非托管文件 debug: var: item.path | basename loop: "{{ zonesdel.files }}" when: item.path | basename not in managed_files.files | map(attribute='path') | map('basename') | list - name: 删除远程服务器上的非托管文件 file: path: "{{ item.path }}" state: absent loop: "{{ zonesdel.files }}" when: item.path | basename not in managed_files.files | map(attribute='path') | map('basename') | list become: true
内容的提问来源于stack exchange,提问作者Picarica
相关产品推荐
相关产品推荐

