Ansible如何从register变量中打印多个匹配的目录路径
Ansible如何从register变量中打印多个匹配的目录路径
嘿,我看你现在的问题是只能打印出第一个搜索目录里的第一个匹配路径对吧?这是因为你在debug任务里直接写了folders_info.results[0].files[0].path——这里的[0]直接限定了只取第一个搜索项(/var)里的第一个匹配文件,自然看不到所有结果啦。
先给你捋清register下来的folders_info结构:folders_info.results是一个列表,每一项对应你with_items里的一个搜索目录(也就是/var和/usr各自的搜索结果);而每个结果项里的files又是一个列表,装着该目录下所有符合条件的文件夹对象。
要打印所有匹配的路径,你需要遍历所有结果项,再遍历每个结果项里的所有files元素。给你两种简单的实现方式:
方式一:用json_query合并所有结果(最简洁)
直接用json_query把所有结果里的files列表展开成一个大列表,然后遍历它:
- name: find directories find: paths: "{{ item }}" recurse: yes file_type: directory use_regex: yes patterns: - '.*log.*' - '.*sbin.*' with_items: - /var - /usr register: folders_info - name: print folders found debug: msg: "{{ item.path }}" loop: "{{ folders_info.results | json_query('[*].files[]') }}"
这里的[*].files[]是json_query的表达式,意思是:遍历results里的每一项,把每一项的files列表都展开,最后合并成一个包含所有匹配文件夹对象的列表,再逐个取出path字段。
方式二:嵌套循环(更直观,适合需要额外信息的场景)
如果想同时显示每个路径来自哪个父搜索目录,可以用嵌套循环:
- name: print folders found debug: msg: "从 {{ result_item.item }} 找到:{{ file_item.path }}" loop: "{{ folders_info.results }}" loop_control: loop_var: result_item with_items: "{{ result_item.files }}" loop_control: loop_var: file_item
这个方式先遍历每个搜索结果项(比如/var的结果、/usr的结果),再遍历每个结果里的所有匹配文件,还能把原搜索目录(result_item.item)也打印出来,更清晰。
这样修改后,你就能看到所有符合条件的目录路径啦,而不是只显示第一个匹配项~
备注:内容来源于stack exchange,提问作者rigged
相关产品推荐
相关产品推荐

