无法使用Ansible执行嵌套循环

时间:2016-03-22 00:52:10

标签: yaml 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部分第三次使用了项目[1],但最终我希望它成为主机名。所以scripts / site1 / site1-router1.txt等等。使用该代码,它可以使site1和site2正确,但我无法弄清楚如何获取主机名变量。

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

site1,路由器1

site1,switch 1

site1,切换N

site2,路由器1

site2,switch 1

site2,切换N

1 个答案:

答案 0 :(得分:1)

首先,你的YAML中存在概念问题,或者在stackoverflow上缩进代码时可能会出现问题。

摘录:

  sites:
    - site1:
      routers:
        - hostname: router1

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

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

      sites:
        - site1:
            routers:
              - hostname: router1
  2. 网站应该是dict而不是列表:

      sites:
        site1:
          routers:
            - hostname: router1
  3. 网站名称应存储为值,而不是密钥:

      sites:
        - name: site1
          routers:
            - hostname: router1
  4. 让我们选择选项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