ansible playbook中的循环(五)---(with_dict 和 with_subelements)

今天继续来认识两个用于循环的关键字,它们是"with_dict"和"with_subelements"

1.with_dict

先来看"with_dict",顾名思义,"with_dict"的使用场景应该与"字典"有关,我们先来看一个小例子,结合示例更加容易说明白,示例playbook如下:

[root@server4 ~]# vim xh19.yml
[root@server4 ~]# cat xh19.yml 
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    users:
      alice: female
      bob: male
  tasks:
  - debug:
      msg: "{{item}}"
    with_dict: "{{users}}"

在上例中,我们使用字典的方式定义了users变量,users中一共有两个用户,alice和bob,从变量的键值对可以看出,alice是女性,bob是男性,然后,我们使用"with_dict"关键字处理了这个字典格式的变量,那么我们来看一下执行效果,上例playbook执行后debug模块的输出信息如下
在这里插入图片描述
从输出信息可以看出,字典格式的users变量经过"with_dict"处理后,字典中的每个键值对被放到了item变量中,而且,键值对中的"键"被放入了"key"关键字中,键值对中的"值"被放入了"value"关键字中,所以,我们可以通过key关键字和value关键字分别获取到字典中键值对的"键"和"值",示例playbook如下

[root@server4 ~]# vim xh20.yml
[root@server4 ~]# cat xh20.yml 
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    users:
      alice: female
      bob: male
  tasks:
  - debug:
      msg: "User name: {{item.key}},User grnder: {{item.value}}"
    with_dict: "{{users}}"

上例执行后debug模块输出如下
在这里插入图片描述
已经明白了"with_dict"的作用,那么我们来扩展一下,将上例中字典格式的变量变得"丰富"一点,示例playbook如下:

[root@server4 ~]# vim xh21.yml
[root@server4 ~]# cat xh21.yml 
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    users:
      alice:
        name: Alice Natasha
        gender: female
        telephone: 123-456-789
      bob:
        name: Bob Jack
        gender: male
        telephone: 987-654-321
  tasks:
  - debug:
      msg: "{{item}}"
    with_dict: "{{users}}"

如上例所示,我们将alice和bob的信息完善了,每个人都有自己姓名,性别,电话等信息,上例playbook执行后debug输出信息如下:
在这里插入图片描述
从输出信息可以看出,gender、name、telephone都被放入了value关键字中,我们可以想到了,这种情况下,如果想要获取到gender、name、telephone的值,则可以使用如下playbook中的方法

[root@server4 ~]# vim xh21.yml
[root@server4 ~]# cat xh21.yml 
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    users:
      alice:
        name: Alice Natasha
        gender: female
        telephone: 123-456-789
      bob:
        name: Bob Jack
        gender: male
        telephone: 987-654-321
  tasks:
  - debug:
      msg: "User {{item.key}} is {{ item.value.name }}, Gender: {{ item.value.gender }}, Tel: {{ item.value.telephone }}"
    with_dict: "{{users}}"

在这里插入图片描述

2.with_subelements

看完"with_dict",现在来看看另一个关键字:“with_subelements”,单单靠语言描述"with_subelements"的作用有些麻烦,也不容易理解,不如先来看一个小示例,示例playbook如下:

[root@server4 ~]# vim xh22.yml 
[root@server4 ~]# cat xh22.yml 
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    users:
    - name: alice
      gender: female
      hobby:
        - Music
    - name: bob 
      gender: male
      hobby: 
        - Skateboard 
        - VideoGame
  tasks:
  - debug:
      msg: "{{item}}"
    with_subelements: 
    - "{{users}}"
    - hobby

如上例所示,我们定义了一个复合结构的字典变量,users变量,users变量列表中有两个块序列,这两个块序列分别代表两个用户,bob和alice,alice是个妹子,bob是个汉子,bob的爱好是滑板和打游戏,alice的爱好是听音乐,上例中,我们使用"with_subelements"关键字处理了users变量,在处理users变量的同时,还指定了一个属性,“hobby属性”,我们可以发现,“hobby属性"正是"users"变量中每个用户的"子属性”,换句话说,“hobby属性"是users中每个块序列的子元素,而且,hobby属性是一个"键值对”,其"值"是一个列表,因为每个人可以有多个爱好,那么经过"with_subelements"处理后,每个item是什么样子的呢?我们来看一下执行效果,执行上例playbook后,debug模块输出如下:
在这里插入图片描述
在这里插入图片描述
从上述输出信息可以看出,一共输出了三个item,第一个item中,alice的名字与性别组成了一个整体,与alice的音乐爱好组合在了一起,第二个item中,bob的名字和性别组成了一个小整体,与bob的滑板爱好组合在了一起,第三个item中,bob的名字和性别组成了一个整体,与bob的打电动爱好组合在了一起,我们可以看出一些规律,规律就是,"with_subelements"会将hobby子元素列表中的每一项作为一个整体,将其他子元素作为一个整体,然后组合在一起,所以,我们可以将上例的playbook修改一下,将msg信息的可读性提高一点,示例如下:

[root@server4 ~]# vim xh22.yml 
[root@server4 ~]# cat xh22.yml 
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    users:
    - name: alice
      gender: female
      hobby:
        - Music
    - name: bob 
      gender: male
      hobby: 
        - Skateboard 
        - VideoGame
tasks:
  - debug:
      #msg: "{{item}}"
      msg: "{{item.0.name}}'s hobby is {{item.1}}"
    with_subelements: 
    - "{{users}}"
    - hobby

由于item由两个整体组成,所以,我们通过item.0获取到第一个小整体,即gender和name属性,然后通过item.1获取到第二个小整体,即hobby列表中的每一项,上例执行后的输出如下:
在这里插入图片描述
经过上述示例,我们已经明白了"with_subelements"的用法了,"with_subelements"可以处理一个像上例中一样的复合结构的字典数据,在处理这个字典的同时,需要指定一个子元素,这个子元素的值必须是一个列表,之后,"with_subelements"会将子元素的列表中的每一项作为一个整体,将其他子元素作为一个整体,然后将两个整体组合成item。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值