如何用Ansible获取匹配模式文件夹列表?find模块匹配失效求助
使用Ansible Find模块获取匹配模式的文件夹列表
针对你的目录结构,我来帮你解决用Ansible find模块获取指定模式文件夹的问题,分几种常见场景给你实操示例:
场景1:获取/home/ryan/ws下所有以service开头的一级目录
如果要拿到service1、service2、service3这些目录,playbook可以这么写:
- name: 查找service开头的一级目录 hosts: localhost tasks: - name: 获取service文件夹列表 ansible.builtin.find: path: /home/ryan/ws file_type: directory # 明确指定只搜索文件夹 patterns: "service*" # 匹配以service开头的目录名称 recurse: no # 不递归,仅查找当前路径下的一级目录 register: service_dirs - name: 输出找到的service目录 ansible.builtin.debug: msg: "{{ item.path }}" loop: "{{ service_dirs.files }}"
场景2:递归获取所有符合版本号格式的子目录
如果要拿到每个service下类似1.0.7.0、1.0.19.0这种x.x.x.x格式的版本目录,需要启用正则匹配:
- name: 查找所有版本号格式的子目录 hosts: localhost tasks: - name: 获取版本文件夹列表 ansible.builtin.find: path: /home/ryan/ws file_type: directory use_regex: yes # 开启正则匹配模式 regex: "^\\d+\\.\\d+\\.\\d+\\.\\d+$" # 匹配x.x.x.x格式的版本号(YAML中需双转义反斜杠) recurse: yes # 递归查找所有子目录 register: version_dirs - name: 输出找到的版本目录 ansible.builtin.debug: msg: "{{ item.path }}" loop: "{{ version_dirs.files }}"
你可能踩过的坑排查
如果之前用find模块没成功,大概率是这几个原因:
- 未指定
file_type: directory:默认find会搜索所有文件类型(含文件和文件夹),如果你的模式同时匹配了文件,就会导致结果混乱或目标文件夹未被筛选 - 正则匹配未开
use_regex: yes:如果用了正则表达式作为匹配规则,必须开启这个参数,否则Ansible会把它当成普通通配符处理 - 递归设置错误:如果要找子目录却忘了开
recurse: yes,只会搜索指定路径的一级目录 - 模式写法错误:比如用了正则语法却没开正则模式,或者YAML中正则的反斜杠未双转义导致匹配失效
扩展:仅获取单个service下的版本目录
如果只想拿service1下的版本目录,可以直接把路径指向service1,再配合正则匹配:
- name: 查找service1下的版本目录 hosts: localhost tasks: - name: 获取service1的版本列表 ansible.builtin.find: path: /home/ryan/ws/service1 file_type: directory use_regex: yes regex: "^\\d+\\.\\d+\\.\\d+\\.\\d+$" recurse: no # 版本目录是service1的直接子目录,无需递归 register: service1_versions - name: 输出service1的版本目录 ansible.builtin.debug: msg: "{{ item.path }}" loop: "{{ service1_versions.files }}"
内容的提问来源于stack exchange,提问作者ryan1506
相关产品推荐
相关产品推荐

