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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:05:29