You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

逻辑说明

  1. 用split('/')拆分路径,再通过reject('equalto', '')过滤掉绝对路径开头拆分出的空字符串;
  2. 对每个路径的片段列表,用range生成1到片段总数的序列,通过slice截取前1个、前2个……前n个片段;
  3. 将每个切片的片段用/拼接,再给开头补/还原绝对路径格式;
  4. 把所有生成的层级路径收集到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

逻辑说明

  1. 同样先拆分并过滤路径片段;
  2. 利用reduce遍历片段,每次将当前片段与上一层路径拼接,生成新的层级路径并加入结果列表;
  3. 最后修正路径开头的格式,确保是标准的绝对路径。

内容的提问来源于stack exchange,提问作者Kevin C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:36:14