如何在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
相关产品推荐
相关产品推荐

