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

如何在Ansible中动态创建任意层级嵌套目录结构

Ansible 动态适配任意层级嵌套目录创建方案

该方案和你提到的mkdir -p jenkins/cache/{war,tmp,workspace}命令效果完全一致,不需要依赖第三方filetree模块,利用Ansible原生特性即可实现,完全不用手动调整item.X索引拼接路径。

核心原理:with_nested遍历多层级配置时,返回的item本身就是按从高到低顺序排列的路径段列表,不需要手动按索引取每一层的值,直接拼接即可自动适配任意层级。

可直接复用的Playbook示例

---
- name: 创建嵌套目录结构
  hosts: localhost
  gather_facts: false
  vars:
    # 目录层级定义:数组顺序对应从根目录到叶子目录的嵌套层级
    # 每个子数组存放当前层级下需要创建的目录名
    # 后续增减嵌套层级,只需要修改这个数组即可,任务逻辑无需任何调整
    dir_hierarchy: [
      ["jenkins"],
      ["cache"],
      ["war", "tmp", "workspace"]
    ]
    base_directory: ~/tmp

  tasks:
    - name: 批量生成所有层级组合的目录
      ansible.builtin.file:
        path: "{{ [base_directory] + item | ansible.builtin.path_join }}"
        state: directory
        mode: '0755'
      with_nested: "{{ dir_hierarchy }}"

关键说明

  • 不要手动写{{item.0}}/{{item.1}}/{{item.2}}这种硬编码索引的拼接逻辑,path_join过滤器会自动遍历传入的路径段列表完成拼接,不管传入的列表有多少层都能正确处理
  • path_join是Ansible 2.10及以上版本内置的官方过滤器,会自动适配当前操作系统的路径分隔符,比手动写/拼接兼容性更好
  • 配置层级时,哪怕某一层只有1个目录,也要统一写成数组格式,避免with_nested解析类型错误
  • 如果使用2.10以下的旧版Ansible,没有内置path_join过滤器,可以把路径拼接行替换为以下写法,效果完全一致:
    path: "{{ [base_directory] + item | join('/') }}"
    

扩展验证

如果需要调整层级,比如新增两层配置:

dir_hierarchy: [
  ["jenkins", "gitlab"],
  ["cache", "data"],
  ["war", "tmp", "workspace"],
  ["v1", "v2"]
]

任务会自动生成所有层级组合的共24个目录路径,不需要修改任何任务逻辑,直接运行即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:42:31