Ansible嵌套循环中如何引用另一个循环的变量生成目标路径
问题根因
你之前的写法错误点在于:folders 变量在Playbook加载阶段就会完成 Jinja 渲染,此时嵌套循环的 item.1 还没有生成,自然无法完成路径拼接,也拿不到预期的输出。
正确实现方案
有两种常用实现方式,都可以得到你要的4个路径输出:
方案1:直接在循环体内拼接路径
不需要提前定义folders变量,直接在循环里完成两个层级的路径拼接:
--- - name: 嵌套循环生成路径测试 hosts: localhost gather_facts: no vars: br: - dir1 - dir2 sub_paths: - sub1 - sub2 tasks: - name: 输出拼接后的完整路径 debug: msg: "/folder1/{{ item.0 }}/{{ item.1 }}" with_nested: - "{{ br }}" - "{{ sub_paths }}"
运行后会按预期输出四个路径:
/folder1/dir1/sub1
/folder1/dir1/sub2
/folder1/dir2/sub1
/folder1/dir2/sub2
方案2:用product过滤器先生成路径列表再循环
如果需要先把所有路径存成变量后续复用,可以用Jinja的product过滤器提前生成全量路径列表:
--- - name: 预生成路径列表测试 hosts: localhost gather_facts: no vars: br: - dir1 - dir2 sub_paths: - sub1 - sub2 # 用product生成两个列表的笛卡尔积,再批量拼接路径 folders: "{{ br | product(sub_paths) | map('join', '/') | map('regex_replace', '^', '/folder1/') | list }}" tasks: - name: 输出预生成的路径 debug: msg: "{{ item }}" loop: "{{ folders }}"
这种写法的folders变量已经直接包含你要的四个完整路径,后续任意位置都可以直接调用。
注意事项
- Ansible的变量渲染是先于任务执行完成的,不要在顶层变量定义里引用只有循环上下文才会存在的
item变量 - 新版Ansible更推荐用
loop + product过滤器替代老旧的with_nested写法,可读性和可维护性更强
内容的提问来源于stack exchange,提问作者sysadreq
相关产品推荐
相关产品推荐

