Ansible中如何基于stat结果仅在路径存在时执行ACL配置?
解决Ansible Playbook中仅为存在路径配置ACL的问题
问题分析
你的Playbook核心需求是仅当目标目录存在时才配置ACL,但原when条件写法有误:__path.results中的每个元素是stat任务的执行结果,它没有直接的path属性,而是通过item.item.path对应原paths变量里的路径;另外,判断路径是否存在更直接的方式是检查stat.exists字段。
解决方案
方法1:直接循环过滤后的stat结果
这种方式逻辑更简洁,直接基于stat任务的结果,只处理存在的路径:
--- - hosts: all become: true gather_facts: yes vars: paths: - name: test-group-1 path: '/path/to/folder/1' entity: group1 etype: group permissions: rwX - name: test-group-2 path: '/path/to/folder/2' entity: group2 etype: group permissions: rwX tasks: - name: 获取路径信息 ansible.builtin.stat: path: "{{ item.path }}" register: __path with_items: "{{ paths }}" - name: 为存在的路径设置默认ACL ansible.posix.acl: path: "{{ item.item.path }}" entity: "{{ item.item.entity}}" permissions: "{{ item.item.permissions }}" etype: "{{ item.item.etype }}" state: present default: true with_items: "{{ __path.results }}" # 仅当路径存在时执行 when: item.stat.exists
方法2:修正原when条件关联逻辑
如果想保持原有的paths循环方式,需要调整when条件,通过路径匹配找到对应的stat结果并检查存在性:
--- - hosts: all become: true gather_facts: yes vars: paths: - name: test-group-1 path: '/path/to/folder/1' entity: group1 etype: group permissions: rwX - name: test-group-2 path: '/path/to/folder/2' entity: group2 etype: group permissions: rwX tasks: - name: 获取路径信息 ansible.builtin.stat: path: "{{ item.path }}" register: __path with_items: "{{ paths }}" - name: 为存在的路径设置默认ACL ansible.posix.acl: path: "{{ item.path }}" entity: "{{ item.entity}}" permissions: "{{ item.permissions }}" etype: group state: present default: true with_items: "{{ paths }}" when: > __path.results | selectattr('item.path', 'equalto', item.path) | map(attribute='stat.exists') | first
关键说明
__path.results中的每个元素包含两个核心部分:item:原paths变量中对应的条目(包含path、entity等参数)stat:stat模块的执行结果(包含exists、path等属性)
- 方法1优势是逻辑直观,直接过滤出存在的路径;方法2保留原
paths循环结构,适合需要基于原变量做额外处理的场景。
内容的提问来源于stack exchange,提问作者Mose
相关产品推荐
相关产品推荐

