在2.5版本之前的ansible中,大多数人习惯使用"with_X"风格的关键字操作循环,从2.6版本开始,官方开始推荐使用"loop"关键字代替"with_X"风格的关键字,我们先来看一个小示例,使用loop关键字进行最简单的列表循环,示例如下:
[root@server4 ~]# vim loopxh1.yml
[root@server4 ~]# cat loopxh1.yml
---
- hosts: testB
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{
{ item }}"
loop:
- teststr1
- teststr2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
上例使用"loop"关键字,替换了之前总结的"with_list"这种"with_X"风格的关键字,它们的效果是完全相同的。
在总结lookup插件的用法时,已经详细的描述过,我们可以使用"loop"关键字配合对应的"lookup"插件,替换更多的、具有更复杂功能的"with_X"风格的关键字,比如,使用loop关键字和dict插件替换"with_dict"关键字,示例如下
[root@server4 ~]# vim loopxh2.yml
[root@server4 ~]# cat loopxh2.yml
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
users:
alice: female
bob: male
tasks:
- debug:
msg: "{
{item.key}} is {
{item.value}}"
loop: "{
{ lookup('dict',users) }}"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
上例使用了**“loop加lookup"的方式,完成了循环操作,而在2.6版本的官网手册中,官方开始推荐使用"loop加filter”**的方式来替代"loop加lookup"的方式,什么意思呢?我们来看一个小例子,如下:
[root@server4 ~]# vim loopxh3.yml
[root@server4 ~]# cat loopxh3.yml
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
users:
alice: female
bob: male
tasks:
- debug:
msg: "{
{item.key}} is {
{item.value}}"
loop: "{
{ users | dict2items }}"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
如上例所示,在使用loop关键字操作对应的字典变量users时,并没有借助dict插件,而是借助了一个名为dict2items的过滤器,前文已经总结了过滤器的使用方法,但是并没有介绍dict2items过滤器的用法,那么此处正好介绍一下dict2items过滤器的使用方法,dict2items过滤器是在2.6版本中新加入的过滤器,它可以把一个字典格式的数据进行转换处理,具体会进行怎样的转换处理:
users是一个字典格式的变量,它的结构是这样的
users:
alice: female
bob: male
当users字典被dict2items转换处理以后,会变成如下模样
users:
- key: alice
value: female
- key: bob
value: male
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8