如何用Ansible为列表中的路径生成所有子路径及完整路径
问题描述
现有如下Ansible变量列表:
my_list: - /tmp/one/two - /root/whatever
需要配置Ansible,使其输出所有路径的层级结构结果:
/tmp /tmp/one /tmp/one/two /root /root/whatever
此前尝试用/拆分路径,但仅能得到单个独立元素,无法生成层级化的完整路径。
解决方案
可以通过拆分路径片段后逐层拼接的方式生成所有层级路径,以下是两种可行的Playbook实现:
方法一:基于切片拼接实现
- name: 生成层级路径列表 hosts: localhost vars: my_list: - /tmp/one/two - /root/whatever tasks: - name: 处理每个路径,生成所有层级路径 set_fact: all_paths: "{{ all_paths | default([]) + item }}" loop: "{{ my_list | map('split', '/') | map('reject', 'equalto', '') | list }}" vars: path_fragments: "{{ item }}" # 生成从第1到第n个片段的切片范围 path_levels: "{{ range(1, path_fragments|length + 1) | map('slice', path_fragments, end=1) | list }}" # 拼接切片为完整绝对路径 item: "{{ path_levels | map('join', '/') | map('regex_replace', '^', '/') | list }}" - name: 输出最终结果 debug: var: all_paths
逻辑说明
- 用
split('/')拆分路径,再通过reject('equalto', '')过滤掉绝对路径开头拆分出的空字符串; - 对每个路径的片段列表,用
range生成1到片段总数的序列,通过slice截取前1个、前2个……前n个片段; - 将每个切片的片段用
/拼接,再给开头补/还原绝对路径格式; - 把所有生成的层级路径收集到
all_paths变量中。
方法二:基于reduce累加实现(更简洁)
- name: 生成层级路径列表 hosts: localhost vars: my_list: - /tmp/one/two - /root/whatever tasks: - name: 处理路径生成层级列表 set_fact: all_paths: "{{ all_paths | default([]) + (item | split('/') | reject('equalto', '') | reduce((acc, elem) => acc + [ (acc[-1] | default('')) ~ '/' ~ elem ], initial=[]) | map('regex_replace', '^/', '') | map('regex_replace', '^', '/') | list ) }}" loop: "{{ my_list }}" - name: 打印结果 debug: var: all_paths
逻辑说明
- 同样先拆分并过滤路径片段;
- 利用
reduce遍历片段,每次将当前片段与上一层路径拼接,生成新的层级路径并加入结果列表; - 最后修正路径开头的格式,确保是标准的绝对路径。
内容的提问来源于stack exchange,提问作者Kevin C
相关产品推荐
相关产品推荐

