嵌套的列表(序列中的序列),示例如下:
---
- 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对齐合并,会是什么效果呢?
这里就不进行示例了,快动手试试吧。