Ansible中基于纯路径列表构建精准排除正则的技术问题
解决Ansible中基于纯路径列表构建精准排除正则的问题
需求回顾
递归检查/var/log目录权限时,需实现以下排除规则:
- 排除指定目录本身(如
/var/log/microsoft/mdatp/rotated/、/var/log/test/) - 排除指定目录下的直接文件/目录(如
/var/log/test/log.txt) - 保留指定目录内的子目录及其中内容(如
/var/log/test/directory/log.txt)
核心思路
针对每个纯路径,构建匹配两种情况的正则分支:
- 完全匹配路径本身(用于排除目录)
- 匹配路径后接一段**不含
/**的内容(用于排除直接子项)
将所有路径的分支合并为一个完整正则表达式,用于过滤结果。
实现步骤
1. 自动构建正则表达式
利用Ansible过滤器链,将纯路径列表转换为符合要求的正则:
regex_escape:转义路径中的特殊字符,避免正则语法冲突regex_replace:为每个路径生成两个匹配分支join('|'):合并所有分支为完整正则
2. 完整Playbook示例
--- - name: 执行权限检查前的文件过滤 become: yes hosts: all vars: # 仅存放纯路径的排除列表 exclusions: ['/var/log/microsoft/mdatp/rotated/', '/var/log/test/'] # 自动生成排除规则正则 exclusion_regex: "{{ exclusions | map('regex_escape') | map('regex_replace', '^(.*)$', '^\\1$|^\\1[^/]+$') | join('|') }}" tasks: - name: 获取/var/log下所有文件和目录 ansible.builtin.find: paths: /var/log/ recurse: yes file_type: any register: all_files - name: 过滤掉需要排除的项 debug: msg: "保留项: {{ item.path }}" loop: "{{ all_files.files }}" when: item.path is not match(exclusion_regex)
效果验证
- 被排除的路径会匹配正则:
/var/log/test/→ 匹配^/var/log/test/$分支/var/log/test/log.txt→ 匹配^/var/log/test/[^/]+$分支
- 被保留的路径不会匹配正则:
/var/log/test/directory/→ 路径包含多层/,不满足[^/]+的匹配规则/var/log/test/directory/log.txt→ 同理,不在排除分支范围内
内容的提问来源于stack exchange,提问作者Darzas
相关产品推荐
相关产品推荐

