前文中,我们总结了with_items的用法,你肯定还有印象,前文中有如下两个示例,它们的执行效果是相同的

示例一
---
- hosts: testBremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_items:- 1- 2- 3示例二
---
- hosts: testBremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_items: [ 1, 2, 3 ]

上述两个示例分别使用了不同的语法自定义了一个列表,虽然语法不同,但是最终的效果是相同的,其实,我们可以把上述两种语法结合起来使用,结合后可以定义出稍微复杂一些的结构,比如嵌套的列表(序列中的序列),示例如下

[root@server4 ~]# vim xh9.yml
[root@server4 ~]# cat xh9.yml
---
- hosts: testBremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_items:- [ 1, 2, 3 ]- [ a, b ]

上例中我们将之前的两种语法结合,定义出了一个列表[[1,2,3],[a,b]],而这个列表中的每一项都是列表,相当于一个大列表中嵌套了多个小列表,那么,当我们使用with_items遍历上述列表时,会是什么样的效果呢?我们试试,执行后的信息如下

[root@server4 ~]# ansible-playbook xh9.yml

可以看到,debug模块循环的将每个小列表中的值都输出了一遍,这可能与我们想象的不太一样,因为在之前的示例中, 并没有列表嵌套列表的情况,按照之前的思路,with_items会循环的输出列表(最外层大列表)中的每一项,也就是说,按照之前的思路debug模块应该会将每个小列表作为一个小整体输出,而不应该输出小列表中的每个元素,但是事实却是with_items将嵌套在大列表中的每个小列表都”展开”了,并且将小列表中的元素都输出了,如果,我们想要将每个小列表作为一个整体输出,该怎么办呢?

我们可以使用with_list关键字,替换上例playbook中的with_items关键字,示例playbook如下

[root@server4 ~]# vim xh10.yml
[root@server4 ~]# cat xh10.yml
---
- hosts: testBremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_list:- [ 1, 2, 3 ]- [ a, b ]

如上例所示,上例playbook中的列表与之前示例playbook中的列表完全相同,都是嵌套的列表,只是将原来的with_items关键字替换为了with_list关键字,那么我们来看一下执行效果,上例playbook执行后debug模块的输出结果如下

[root@server4 ~]# ansible-playbook xh10.yml

如上述信息所示,经过with_list处理后,每个嵌套在大列表中的小列表都被当做一个整体存放在item变量中,最终被debug作为一个小整体输出了,而不会像with_items一样将小列表”展开拉平”后一并将小列表中的元素循环输出。

前一篇文章中有很多示例,其实这些示例中的with_items关键字都可以替换成with_list关键字,替换后都可正常执行,这是因为,前一篇文章中的示例中的列表都是简单的单层列表,当处理单层的简单列表时,with_list与with_items没有任何区别,只有在处理上例中的”嵌套列表”时,才会体现出区别,区别就是,with_items会将嵌套在内的小列表”拉平”,拉平后循环处理所有元素,而with_list则不会”拉平”嵌套的列表,with_list只会循环的处理列表(最外层列表)中的每一项

其实,当处理这种嵌套的列表时,如果想要实现”拉平”的效果,我们还能使用另外一个关键字,它就是with_flattened关键字,示例playbook如下:

[root@server4 ~]# vim xh11.yml
[root@server4 ~]# cat xh11.yml
---
- hosts: testBremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_flattened:- [ 1, 2, 3 ]- [ a, b ]

执行上例playbook以后,你会发现,执行效果与with_items效果完全相同:

此刻,你一定已经明白了with_list、with_items、with_flattened之间的区别了,在处理简单的单层列表时,他们没有区别,但是当处理嵌套的多层列表时,with_items与with_flattened会将嵌套列表”拉平展开”,循环的处理每个元素,而with_list只会处理最外层的列表,将最外层的列表中的每一项循环处理。

话说,我们还能使用如下方法定义嵌套的列表,示例如下:

with_list:
-- 1- 2- 3
-- a- b

上述方法通过缩进对齐的方式,定义出了一个嵌套有列表的列表,与如下定义完全相同

with_list:
- [ 1, 2, 3 ]
- [ a, b ]

目前为止,我们已经了解到了三个关键字可以用于循环操作,它们是with_list、with_items、with_flattened,那么我们再来认识一个新的关键字,它就是”with_together”,with_together可以将两个列表中的元素”对齐合并”,单单用语言来描述,不是特别容易理解,不如来看一个小示例,示例playbook如下:

[root@server4 ~]# vim xh12.yml
[root@server4 ~]# cat xh12.yml
---
- hosts: testBremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_together:- [ 1, 2, 3 ]- [ a, b, c ]

如上例所示,我们定义了一个嵌套的列表,大列表内一共有两个小列表,每个小列表内有三个值,然后使用with_together关键字处理这个嵌套列表,上例playbook执行结果如下

[root@server4 ~]# ansible-playbook xh12.yml

从上述结果可以看出:

第一个小列表中的第1个值与第二个小列表中的第1个值合并在一起输出了,

第一个小列表中的第2个值与第二个小列表中的第2个值合并在一起输出了,

第一个小列表中的第3个值与第二个小列表中的第3个值合并在一起输出了,

这就是with_together所谓的”对齐合并”功能,聪明如你一定已经明白了。

不过上例中,两个小列表中的元素数量相同,如果元素数量不同的小列表使用with_together对齐合并,其执行的效果是:

[root@server4 ~]# vim xh12.yml
[root@server4 ~]# cat xh12.yml
---
- hosts: testBremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_together:- [ 1, 2, 3 ]- [ a, b ]
[root@server4 ~]# ansible-playbook xh12.yml

Ansible(十七)-- ansible 中的循环(二) with_items with_list with_flattened with_together之间的区别和联系相关推荐

  1. ansible中的循环(二)-----(with_items with_list with_flattened with_together介绍)

    文中,我们总结了with_items的用法,你肯定还有印象, 我们可以把定义列表的两种语法结合起来使用,结合后可以定义出稍微复杂一些的结构,比如嵌套的列表(序列中的序列),示例如下 [root@ser ...

  2. 循环前增加和后增加之间的区别?

    本文翻译自:Difference between pre-increment and post-increment in a loop? Is there a difference in ++i an ...

  3. 【循序渐进学Python】Python中的循环(二)——while循环与嵌套

    [循序渐进学Python]Python中的循环--while循环与嵌套 while循环(在给定的判断条件为 True 时执行循环体,False退出循环体) 当满足一定条件的时候才循环,具体循环多少次没 ...

  4. r中rep_Spring中@ Component,@ Service,@ Controller和@Repository之间的区别

    r中rep 在了解Spring框架中@Repository @Component , @Service @Controller , @Repository @Controller和@Repositor ...

  5. Spring中@ Component,@ Service,@ Controller和@Repository之间的区别

    在了解Spring框架中@Repository @Component , @Service @Controller , @Repository @Controller和@Repository批注之间的 ...

  6. jvm优化_Java中JVM,JIR,JRE和JDK之间的区别

    jvm优化 JRE,JVM和JDK是您经常与Java编程语言结合使用的三个术语,大多数人会混淆它们或认为它们都是相同的. 在本文中,您将了解什么是Java运行时(JRE),什么是Java虚拟机(JVM ...

  7. java中gt与gtgt与gtgtgt与lt之间的区别

    1. 今天在刷剑指,遇到一道题: **输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.** 看到一个使用逻辑移位的放大进行的操作,很受启发,顺便整理一下从未用到的符号含义. 2. 符号 ...

  8. Java中的executeQuery_java execute,executeQuery和executeUpdate之间的区别

    java execute,executeQuery和executeUpdate之间的区别 关注:269  答案:4  信息版本:手机版 电脑版 解决时间 2021-01-25 18:31 提问者怪咖 ...

  9. 程序员面试中一面、二面、三面有什么区别?

    很多公司面试都分一面.二面.三面甚至更多,大家可能会好奇,为什么要面这么多面,每一面又有啥区别呢? 首先我来回答下为什么要这么多面,最核心的是最后3点: 如果光是一个人面,担心会看走眼: 面试通过最后 ...

最新文章

  1. Science Robotics:仿生手臂的神经机器人感觉运动融合恢复自然行为
  2. Markov Decision Processes
  3. 在 asp.net mvc中的简单分页算法 (续)
  4. android adjust,android adjustresize adjustpan着名的问题
  5. 跨境电商独立站是什么意思?
  6. 如何打开别人发布的vue项目---express的使用方法
  7. 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符
  8. OpenCV搜索文件夹中的图片并保存图片路径和信息
  9. vue 组件 not defined_Vue、Spring Boot开发小而完整的Web前后端分离项目实战10
  10. 非对称加密 DH算法
  11. Unity粒子特效的缩放与加(减)速
  12. 计算机网络中的网卡作用
  13. 推动服务网格社区前进
  14. Linux在线词典问题,linux中goldendict发声词典播放报错问题解决方案
  15. opensuse15.0测试使用snapper
  16. 数制转换c语言编程,C语言数据结构中数制转换实例代码
  17. 从Go走进plan9汇编
  18. c-lightning 闪电网络配置洋葱服务(tor)
  19. 数字化改革是逼不得已,最后却帮我提高了20%生产效率
  20. 地图采集车的那些事 | 惯性导航

热门文章

  1. c++中define用法
  2. 关于TensorFlow-gpu出现nan原因
  3. elasticsearch:调用接口设置search.max_buckets的值
  4. 26、具有挂起状态的进程状态转换
  5. list-style无效
  6. 计算机的ip能与网关一样,网关和ip地址一样吗
  7. 立体3D场景字幕条文本动画万圣节开场视频pr模板
  8. 理论物理研究:熵的模拟
  9. 源终端匹配电阻的分析及EMC相关问题
  10. squirrelmail 配置