我正在尝试设置一个循环播放某些网站的剧本。在站点内,将有路由器和交换机。通常会有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部分第三次使用了项目[1],但最终我希望它成为主机名。所以scripts / site1 / site1-router1.txt等等。使用该代码,它可以使site1和site2正确,但我无法弄清楚如何获取主机名变量。
我已经在with_nested下尝试了多个变量,但却无法得到它。最终结果将是:
site1,路由器1
site1,switch 1
site1,切换N
site2,路由器1
site2,switch 1
site2,切换N
答案 0 :(得分:1)
首先,你的YAML中存在概念问题,或者在stackoverflow上缩进代码时可能会出现问题。
摘录:
sites:
- site1:
routers:
- hostname: router1
恕我直言,没有意义。 site1
是一个空密钥。它应该是以下选项之一:
routers
应该是site1的子元素:
sites: - site1: routers: - hostname: router1
网站应该是dict而不是列表:
sites: site1: routers: - hostname: router1
网站名称应存储为值,而不是密钥:
sites: - name: site1 routers: - hostname: router1
让我们选择选项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