2016-03-22 57 views
2

我正在嘗試設置循環播放某些網站的劇本。在這些站點中,將會有路由器和交換機。通常會有1臺路由器和至少1臺交換機。現在,我只是試圖讓邏輯適用於兩個站點,每個站點都有一個路由器。我相信我需要「with_nested」,但不能拿出獲勝的代碼。這是我現在有:無法與Ansible進行嵌套循環

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 }}" 

現在我有項目[1]在DEST節第三次,但最終我想,是主機名。所以scripts/site1/site1-router1.txt等等。使用該代碼,它獲得了site1和site2的正確,但我無法弄清楚如何到達主機名變量。

我已經嘗試了多個變量下with_nested但只是無法得到它。最後的結果將是:

SITE1,路由器1

SITE1,開關1

SITE1,開關型號N

站點2,路由器1

站點2中,開關1

站點2 ,開關N

回答

1

首先,要麼有一個概念在你的YAML中遇到問題,或者當在stackoverflow上縮進代碼時,它可能會被破壞。

摘錄:

sites: 
    - site1: 
     routers: 
     - hostname: router1 

恕我直言,這是沒有意義的。 site1是一個空鍵。它應該要麼是其中一個選項:

  1. routers應該是站點1的子元素:

     sites: 
        - site1: 
         routers: 
          - hostname: router1
  2. 網站應該是一個字典,而不是一個列表:

     sites: 
        site1: 
         routers: 
         - hostname: router1
  3. 網站名稱應存儲爲值,而不是作爲關鍵字:

     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 
+0

非常感謝你。我最初的結構是如何在選項3中完成它,但嘗試了很多被混蛋的東西。現在來搞清楚Jinja2的一部分。 – mikey