嵌套的列表(序列中的序列),示例如下:
--- - 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對齊合並,會是什么效果呢?
這里就不進行示例了,快動手試試吧。