ansible筆記(15):循環(二)with_items/with_list/with_together/with_flattened


嵌套的列表(序列中的序列),示例如下:

---
- hosts: 192.168.10.2
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_items:
    - [1,2,3]
    - [a,b]

上例中我們將之前的兩種語法結合,定義出了一個列表,而這個列表中的每一項都是列表,相當於一個大列表中嵌套了多個小列表,那么,當我們使用with_items遍歷上述列表時,會是什么樣的效果呢?我們試試,執行后的信息如下:

 

 

可以看到,debug模塊循環的將每個小列表中的值都輸出了一遍,這可能與我們想象的不太一樣,因為在之前的示例中, 並沒有列表嵌套列表的情況,按照之前的思路,with_items會循環的輸出列表(最外層大列表)中的每一項,也就是說,按照之前的思路debug模塊應該會將每個小列表作為一個小整體輸出,而不應該輸出小列表中的每個元素,但是事實卻是with_items將嵌套在大列表中的每個小列表都  展開 了,並且將小列表中的元素都輸出了,如果,我們想要將每個小列表作為一個整體輸出,該怎么辦呢? 
 

我們可以使用with_list關鍵字,替換上例playbook中的with_items關鍵字,那么with_list關鍵字與with_items關鍵字有什么區別呢?將上例的with_items替換成with_list以后又能不能實現我們想要的效果呢?我們一起來試試,示例playbook如下:

---
- hosts: 192.168.10.2
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_list:
    - [1,2,3]
    - [a,b]

如上例所示,上例playbook中的列表與之前示例playbook中的列表完全相同,都是嵌套的列表,只是將原來的with_items關鍵字替換為了with_list關鍵字,那么我們來看一下執行效果,上例playbook執行后debug模塊的輸出結果如下:把列表單獨輸出。

 

 

 

如上述信息所示,經過with_list處理后,每個嵌套在大列表中的小列表都被當做一個整體存放在item變量中,最終被debug作為一個小整體輸出了,而不會像with_items一樣將小列表  展開拉平  后一並將小列表中的元素循環輸出。

前一篇文章中有很多示例,其實這些示例中的with_items關鍵字都可以替換成with_list關鍵字,替換后都可正常執行,這是因為,前一篇文章中的示例中的列表都是簡單的單層列表,當處理單層的簡單列表時,with_list與with_items沒有任何區別,只有在處理上例中的 嵌套列表 時,才會體現出區別,區別就是,with_items會將嵌套在內的小列表  拉平  ,拉平后循環處理所有元素,而with_list則不會  拉平  嵌套的列表,with_list只會循環的處理列表(最外層列表)中的每一項。 

其實,當處理這種嵌套的列表時,如果想要實現 拉平 的效果,我們還能使用另外一個關鍵字,它就是with_flattened關鍵字,示例playbook如下:

---
- hosts: 192.168.10.2
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_flattened:   #效果和with_items等效
    - [1,2,3]
    - [a,b]

 

學習一個新的關鍵字:with_together,可以將兩個列表中的元素“對齊合並”,示例如下:

---
- hosts: 192.168.10.2
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_together:
    - [1,2,3]
    - [a,b,c]

如上例所示,我們定義了一個嵌套的列表,大列表內一共有兩個小列表,每個小列表內有三個值,然后使用with_together關鍵字處理這個嵌套列表,上例playbook執行結果如下:

從上述結果可以看出: 
 第一個小列表中的第1個值與第二個小列表中的第1個值合並在一起輸出了, 
 第一個小列表中的第2個值與第二個小列表中的第2個值合並在一起輸出了, 
 第一個小列表中的第3個值與第二個小列表中的第3個值合並在一起輸出了, 
 這就是with_together所謂的 對齊合並 功能,聰明如你一定已經明白了。 
 不過上例中,兩個小列表中的元素數量相同,如果元素數量不同的小列表使用with_together對齊合並,會是什么效果呢? 
 這里就不進行示例了,快動手試試吧。 
 

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM