如何在Ansible Playbook中实现嵌套循环以遍历路由器及接口?
Ansible实现嵌套循环遍历路由器及接口
问题描述
我尝试在Ansible Playbook里写嵌套循环,但搞不清正确格式。
我的变量定义:
routers: - rtr: "ext-fw-{{ project_nummer }}" interfaces: - name: eth0 networks: "vlan-ext-dmz" ip: "172.16.100.{{ ip_sub|int|abs }}" netmask: "/24" - name: eth1 networks: "vlan-{{ project_nummer }}" ip: "{{ ip_subnet }}.0.126" netmask: "/26" - rtr: "int-fw-{{ project_nummer }}" interfaces: - name: eth0 networks: "vlan-int-dmz" ip: "172.16.200.{{ ip_sub|int|abs }}" netmask: "/24" - name: eth1 networks: "vlan-{{ project_nummer | int +1 }}" ip: "{{ ip_subnet }}.128.126" netmask: "/26"
当前Playbook内容:
tasks: - name: Debug routers vars debug: #msg: "{{ item }}" msg: "Hello {{ routers[0].interfaces }}" loop: "{{ routers }}"
我想遍历routers列表的同时,再遍历每个路由器下的interfaces列表,拿到每个接口的键值对,这能实现吗?
解决方案
当然可行,Ansible有多种方式实现嵌套循环,最方便的是用subelements查找插件,直接处理这种父列表包含子列表的结构。
方法1:用subelements实现(推荐)
把你的debug任务改成这样:
tasks: - name: 输出路由器及接口详情 debug: msg: "路由器: {{ item.0.rtr }},接口: {{ item.1.name }},IP: {{ item.1.ip }},子网掩码: {{ item.1.netmask }}" loop: "{{ routers | subelements('interfaces') }}"
item.0对应父元素,也就是每个路由器的对象item.1对应子元素,也就是该路由器下的每个接口对象
方法2:显式嵌套循环(适合复杂场景)
如果需要更灵活的嵌套逻辑,可以拆分任务,用include_tasks实现:
主Playbook里的任务:
tasks: - name: 遍历每个路由器 include_tasks: process_interfaces.yml loop: "{{ routers }}" loop_control: loop_var: router
新建process_interfaces.yml文件,内容如下:
- name: 遍历当前路由器的所有接口 debug: msg: "路由器: {{ router.rtr }},接口: {{ item.name }},IP: {{ item.ip }}" loop: "{{ router.interfaces }}"
说明
subelements是处理这种嵌套列表循环的最优选择,代码简洁可读性高。- 两种方式都能满足需求,根据你的实际场景选就行。
内容的提问来源于stack exchange,提问作者OMF
相关产品推荐
相关产品推荐

