我正在尝试设置一个循环访问某些站点的剧本。 在站点内,将有路由器和交换机。 一般会有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
是一个空键。它应该是以下选项之一:
routers
应该是 site1 的子元素:网站: - 站点 1: 路由器: - 主机名:路由器1
网站应该是字典而不是列表:
网站: 站点 1: 路由器: - 主机名:路由器1
站点名称应存储为值,而不是键:
网站: - 名称:站点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