无法使用 Ansible 执行嵌套循环



我正在尝试设置一个循环访问某些站点的剧本。 在站点内,将有路由器和交换机。 一般会有1个路由器和至少1个交换机。 目前,我只是想让逻辑适用于两个站点,每个站点 1 个路由器。 我相信我需要"with_nested"但无法想出获胜代码。 这就是我现在拥有的:

hosts: local
vars:
  data_vlan: 10
  voice_vlan: 20
  sites:
    - site1:
      routers:
        - hostname: router1
          loopback0: 192.168.1.1
          wan_ip: 10.0.0.2
          lan_ip: 172.16.1.1
    - site2:
      routers:
        - hostname: router1
          loopback0: 192.168.2.1
          wan_ip: 10.0.0.4
          lan_ip: 172.16.2.1
tasks:
  - name: Generate router configs
    template: src=templates/router.j2 dest=scripts/{{ item  [1] }}/{{ item[1] }}-{{ item[1] }}.txt
    with_nested:
      - "{{ sites }}"

现在我在 dest 部分第三次有 item[1],但最终我希望它是主机名。 所以脚本/站点 1/站点 1-router1.txt等等。 使用该代码,它可以使站点 1 和站点 2 正确,但我无法弄清楚如何访问主机名变量。

我已经尝试了with_nested下的多个变量,但就是无法得到它。 最终结果将是:

站点 1,路由器 1

站点 1,交换机 1

站点 1,交换机 N

站点 2,路由器 1

站点 2,交换机 1

站点 2,交换机 N

首先,您的 YAML 中存在概念问题,或者在堆栈溢出上缩进代码时它可能被破坏了。

摘录:

  sites:
    - site1:
      routers:
        - hostname: router1

恕我直言,这没有意义。 site1是一个空键。它应该是以下选项之一:

  1. routers应该是 site1 的子元素:

     网站:    - 站点 1:        路由器:          - 主机名:路由器1
  2. 网站应该是字典而不是列表:

     网站:    站点 1:      路由器:        - 主机名:路由器1
  3. 站点名称应存储为值,而不是键:

     网站:    - 名称:站点1      路由器:        - 主机名:路由器1

让我们选择选项 3,因为它最容易循环。此外,它不需要您知道访问内容的站点名称。所有内容都可以通过通用键(sites[0].name/sites[0].routers[0].hostname等)访问,在所有其他解决方案中,您需要知道站点的名称,然后才能访问内容。

我相信我需要"with_nested"

关闭。我也总是弄错,不得不查一下。要使用的正确循环是with_subelements:

- debug: msg="{{ item.0.name }} {{ item.1.hostname }}"
  with_subelements:
    - "{{ sites }}"
    - routers

最新更新