如何在Ansible循环中仅当文件存在时修改其权限?
解决Ansible循环中修改文件权限前检查文件存在的问题
场景与原有Playbook
通过前置命令获取了指定目录下的可执行文件列表,想要移除这些文件的可执行权限,原有Playbook如下:
- name: Ensure executable is removed file: path: '{{ item }}' mode: a-x with_items: - '{{ my_list.stdout_lines }}' ignore_errors: true
遇到的问题
执行过程中,部分文件可能被其他进程提前删除,导致Ansible报错“[file] is absent, cannot continue”。虽然设置了ignore_errors: true能让Playbook继续执行,但希望彻底消除这类错误,因此需要先检查文件是否存在,再执行权限修改操作。
你的尝试(存在错误)
你尝试的写法无法生效,问题出在when条件的写法:
- name: Ensure executable is removed file: path: '{{ item }}' mode: a-x when: {{ item }}.stat.exists == true with_items: - '{{ my_list.stdout_lines }}' ignore_errors: true
这里有两个核心问题:
when条件内不需要用{{ }}包裹变量引用,语法本身错误- 没有提前获取文件的
stat信息,直接引用item.stat.exists是无效的,Ansible无法识别这个属性值
正确实现方案
需要先通过stat模块批量获取所有目标文件的存在状态,再根据状态过滤执行权限修改:
# 第一步:获取所有目标文件的stat信息 - name: Get stat info for target files stat: path: "{{ item }}" register: file_stat_results with_items: "{{ my_list.stdout_lines }}" # 第二步:仅对存在的文件移除可执行权限 - name: Remove executable permissions from existing files file: path: "{{ item.item }}" mode: a-x when: item.stat.exists with_items: "{{ file_stat_results.results }}"
说明
- 第一个任务用
stat模块遍历所有文件,将每个文件的状态信息注册到file_stat_results变量中 - 第二个任务遍历
file_stat_results.results,每个元素包含原文件路径(item.item)和对应的stat数据 - 通过
when: item.stat.exists判断文件是否存在,仅对存在的文件执行权限修改 - 这种方式不需要再设置
ignore_errors: true,从根源避免了文件不存在的报错
内容的提问来源于stack exchange,提问作者Apolymoxic
相关产品推荐
相关产品推荐

