Ansible 循环

一、简单介绍

在ansible2.5之前,大多数人使”with_XXX”类型的关键字来操作循环,但是从2.6版本开始,官方推荐是”loop”关键字代替” with_XXX”。

1.我们先看下一个小例子,使用loop关键字进行最简单的循环:

[root@localhost cycle]# cat cycle..yml

---

  - name: cycletest

    hosts: test

    gather_facts: no

    tasks:

    - name: debug cycle

      debug:

        msg: "{{ item }}"

      loop:

        - test1

        - test2

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test] ***************************************************************************************

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item=test1) => {

    "msg": "test1"

}

ok: [192.168.15.10] => (item=test2) => {

    "msg": "test2"

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle ------------------------------------------------------------- .17s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed.

实例中所以loop关键字,替换之前的with_XXX关键字,它们的效果是完全相同的。

2.我们可以使用loop关键字和dict插件代替”with_dict”关键字,示例如下:

[root@localhost cycle]# cat cycle..yml

---

  - name: cycle test2

    hosts: test

    gather_facts: no

    vars:

      dicts:

        China: 

        America: 

    tasks:

    - name: debug cycle

      debug:

        msg: "{{ item.key }} is no.{{ item.value }}"

      loop: "{{ lookup('dict',dicts) }}"

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test2] **************************************************************************************

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item={'key': u'America', 'value': }) => {

    "msg": "America is no.2"

}

ok: [192.168.15.10] => (item={'key': u'China', 'value': }) => {

    "msg": "China is no.1"

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle ------------------------------------------------------------- .18s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed

示例已经在上一个例子中讲述,再次不在讲述

3.上个例子中使用”loop+lookup”的方式完成循环,而在2.6版本的官网中推荐使用”loop+filter”方式老代替”loop+loopup”的方式,什么意思呢? 我们来看个小例子,如下:

---

  - name: cycle test3

    hosts: test

    gather_facts: no

    vars:

      dicts:

        China: 

        America: 

    tasks:

    - name: debug cycle

      debug:

        msg: "{{ item.key }} is no.{{ item.value }}"

      loop: "{{ dicts | dict2items }}"

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test3] **************************************************************************************

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item={'key': u'America', 'value': }) => {

    "msg": "America is no.2"

}

ok: [192.168.15.10] => (item={'key': u'China', 'value': }) => {

    "msg": "China is no.1"

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle ------------------------------------------------------------- .18s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed.

如上例所示,在使用loop关键字操作对于的字典变量users时,并没有借助dict插件,而是使用dict2items的过滤器。

二、具体示例

1.With_list

#loop可以替代with_list,当处理嵌套的列表时,列表不会被拉平

[root@localhost cycle]# cat cycle..yml

---

  - name: cycle test4

    hosts: test

    gather_facts: no

    vars:

      dicts:

        - A

        - B

        - [c,D]

    tasks:

    - name: debug cycle

      debug:

        msg: "{{ item }}"

      loop: "{{ dicts }}"

结果:

[root@localhost cycle]# ansible-playbook cycle.4.yml

PLAY [cycle test4] **************************************************************************************

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item=A) => {

    "msg": "A"

}

ok: [192.168.15.10] => (item=B) => {

    "msg": "B"

}

ok: [192.168.15.10] => (item=[u'c', u'D']) => {

    "msg": [

        "c",

        "D"

    ]

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=1    changed=0    unreachable=0    failed=0    skipped=0  

debug cycle ------------------------------------------------------------- 0.19s

Playbook finished: Mon Dec 24 18:25:41 2018, 1 total tasks.  0:00:00 elapsed.

  

2.With_flattened

#flatten过滤器可以替代with_flattened,当处理多层嵌套的列表时,列表中所有的嵌套层级都会被拉平

[root@localhost cycle]# cat cycle.5.yml

---

  - name: cycle test5

    hosts: test

    gather_facts: no

    vars:

      dicts:

        - A

        - B

        - [c,D]

    tasks:

    - name: debug cycle

      debug:

        msg: "{{ item }}"

      loop: "{{ dicts | flatten }}"

  

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test5] **************************************************************************************

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item=A) => {

    "msg": "A"

}

ok: [192.168.15.10] => (item=B) => {

    "msg": "B"

}

ok: [192.168.15.10] => (item=c) => {

    "msg": "c"

}

ok: [192.168.15.10] => (item=D) => {

    "msg": "D"

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle ------------------------------------------------------------- .19s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed.

3.With_items

#flatten过滤器(加参数)可以替代with_items,当处理多层嵌套的列表时,只有列表中的第一层会被拉平

[root@localhost cycle]# cat cycle..yml

---

  - name: cycle test6

    hosts: test

    gather_facts: no

    vars:

      dicts:

        - A

        - B

        - [c,D]

    tasks:

    - name: debug cycle

      debug:

        msg: "{{ item }}"

      loop: "{{ dicts | flatten(levels=1) }}"

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test6] **************************************************************************************

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item=A) => {

    "msg": "A"

}

ok: [192.168.15.10] => (item=B) => {

    "msg": "B"

}

ok: [192.168.15.10] => (item=c) => {

    "msg": "c"

}

ok: [192.168.15.10] => (item=D) => {

    "msg": "D"

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle ------------------------------------------------------------- .29s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed.

#PS 嗯 处理下客户问题先。Weblogic真毒~

4.With_indexed_items

#flatten过滤器(加参数),再配合loop_control关键字,可以替代with_indexed_items

#当处理多层嵌套的列表时,只有列表中的第一层会被拉平,flatten过滤器的bug暂且忽略

[root@localhost cycle]# cat cycle..yml

---

  - name: cycle test7

    hosts: test

    gather_facts: no

    vars:

      dicts:

        - A

        - B

        - [c,D]

    tasks:

    - name: debug cycle

      debug:

        msg: " {{ index}}--{{ item }}"

      loop: "{{ dicts | flatten(levels=1) }}"

      loop_control:

        index_var: index

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test7] **************************************************************************************

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item=A) => {

    "msg": " 0--A"

}

ok: [192.168.15.10] => (item=B) => {

    "msg": " 1--B"

}

ok: [192.168.15.10] => (item=c) => {

    "msg": " 2--c"

}

ok: [192.168.15.10] => (item=D) => {

    "msg": " 3--D"

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle ------------------------------------------------------------- .21s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed.

“loop_control”关键字可以用于控制循环的行为,比如在循环是获取元素的索引。

“index_var “是”loop_control”的一个设置选项,”index_var”可以让我们指定变量,”loop_control”会将元素索引值存放在指定变量中

5.With_togeher

[root@localhost cycle]# cat cycle..yml

---

  - name: cycle test8

    hosts: test

    gather_facts: no

    vars:

      testlist1: [ A,B,C,D ]

      testlist2: [ ,, ]

      testlist3: [ x,y ]

    tasks:

    - name: debug cycle with_together

      debug:

        msg: " {{ item.0 }} - {{ item.1 }} - {{ item.2 }}"

      with_together:

        - "{{ testlist1 }}"

        - "{{ testlist2 }}"

        - "{{ testlist3 }}"

    - name: debug cycle loop+zip_logest

      debug:

        msg: " {{ item.0 }} - {{ item.1 }} - {{ item.2 }}"

      loop: "{{ testlist1 | zip_longest(testlist2,testlist3) | list }}

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test8] **************************************************************************************

TASK [debug cycle with_together] ************************************************************************

ok: [192.168.15.10] => (item=[u'A', , u'x']) => {

    "msg": " A - 110 - x"

}

ok: [192.168.15.10] => (item=[u'B', , u'y']) => {

    "msg": " B - 120 - y"

}

ok: [192.168.15.10] => (item=[u'C', , None]) => {

    "msg": " C - 911 - "

}

ok: [192.168.15.10] => (item=[u'D', None, None]) => {

    "msg": " D -  - "

}

TASK [debug cycle loop+zip_logest] **********************************************************************

ok: [192.168.15.10] => (item=[u'A', , u'x']) => {

    "msg": " A - 110 - x"

}

ok: [192.168.15.10] => (item=[u'B', , u'y']) => {

    "msg": " B - 120 - y"

}

ok: [192.168.15.10] => (item=[u'C', , None]) => {

    "msg": " C - 911 - "

}

ok: [192.168.15.10] => (item=[u'D', None, None]) => {

    "msg": " D -  - "

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle with_together ----------------------------------------------- .25s

debug cycle loop+zip_logest --------------------------------------------- .21s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed.

示例中同时写出2中方法方便进行比较。

但多个列表使用”with_together”进行对比合并时,如果列表长度不同,这使用最长的列表长度进行对其,由于短列表中元素不足,所以使用空值与长列表中元素进行对齐,zip_longest过滤器也和”with_together”一样,对列表进行组合,但是还需要借助list过滤器,将组合的数据列表化。

可以指定字符代替空值

  - debug:

      msg: "{{ item.0 }} - {{ item.1 }} - {{item.2}}"

loop: "{{ testlist1 | zip_longest(testlist2,testlist3,fillvalue='None') | list }}"

和最短的列表进行对齐

 - debug:

      msg: "{{ item.0 }} - {{ item.1 }} - {{item.2}}"

loop: "{{ testlist1 | zip(testlist2,testlist3) | list }}"

.With_nested/With_cartesian

#product过滤器配合list过滤器,可以替代with_nested和with_cartesian

[root@localhost cycle]# cat cycle..yml

---

  - name: cycle test4

    hosts: test

    gather_facts: no

    vars:

      list1: [ ,, ]

      list2: [ a,b,c,d ]

    tasks:

    - name: debug cycle

      debug:

        msg: "{{ item.0 }} ----  {{ item.1 }}"

      loop: "{{ list1 | product(list2) | list }}"

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test4] **************************************************************************************

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item=[, u'a']) => {

    "msg": "1 ----  a"

}

ok: [192.168.15.10] => (item=[, u'b']) => {

    "msg": "1 ----  b"

}

ok: [192.168.15.10] => (item=[, u'c']) => {

    "msg": "1 ----  c"

}

ok: [192.168.15.10] => (item=[, u'd']) => {

    "msg": "1 ----  d"

}

ok: [192.168.15.10] => (item=[, u'a']) => {

    "msg": "2 ----  a"

}

ok: [192.168.15.10] => (item=[, u'b']) => {

    "msg": "2 ----  b"

}

ok: [192.168.15.10] => (item=[, u'c']) => {

    "msg": "2 ----  c"

}

ok: [192.168.15.10] => (item=[, u'd']) => {

    "msg": "2 ----  d"

}

ok: [192.168.15.10] => (item=[, u'a']) => {

    "msg": "3 ----  a"

}

ok: [192.168.15.10] => (item=[, u'b']) => {

    "msg": "3 ----  b"

}

ok: [192.168.15.10] => (item=[, u'c']) => {

    "msg": "3 ----  c"

}

ok: [192.168.15.10] => (item=[, u'd']) => {

    "msg": "3 ----  d"

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle ------------------------------------------------------------- .31s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed.

7.With_random_choice

#使用random函数可以替代with_random_choice,由于random函数是随机取出列表中的一个值,并不涉及循环操作,所以并不用使用loop关键字。

[root@localhost cycle]# cat cycle..yml

---

  - name: cycle test

    hosts: test

    gather_facts: no

    vars:

      list: [a,b,c]

    tasks:

    - name: debug cycle

      debug:

        msg: "{{ list | random }}"

    -  debug:

        msg: "{{ list | random }}"

    -  debug:

        msg: "{{ list | random }}

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test] ***************************************************************************************

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => {

    "msg": "a"

}

TASK [debug] ********************************************************************************************

ok: [192.168.15.10] => {

    "msg": "a"

}

TASK [debug] ********************************************************************************************

ok: [192.168.15.10] => {

    "msg": "c"

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle ------------------------------------------------------------- .18s

 ------------------------------------------------------------------------ .16s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed.

8.with_dict

#除了上文总结的dict2items过滤器,dictsort过滤器也可以替代with_dict

[root@localhost cycle]# cat cycle..yml

---

  - name: cycle test2

    hosts: test

    gather_facts: no

    vars:

      dicts:

        China: 

        America: 

        aaa: 

        bbb: 

        ccc: 

    tasks:

    - name: debug cycle dict2items

      debug:

        msg: "{{ item.key }} is no.{{ item.value }}"

      loop: "{{ dicts | dict2items }}"

    - name: debug cycle

      debug:

        msg: "{{ item.0 }} is no.{{ item.1 }}"

      loop: "{{ dicts | dictsort }}"

结果:

[root@localhost cycle]# ansible-playbook cycle..yml

PLAY [cycle test2] **************************************************************************************

TASK [debug cycle dict2items] ***************************************************************************

ok: [192.168.15.10] => (item={'key': u'China', 'value': }) => {

    "msg": "China is no.1"

}

ok: [192.168.15.10] => (item={'key': u'America', 'value': }) => {

    "msg": "America is no.2"

}

ok: [192.168.15.10] => (item={'key': u'aaa', 'value': }) => {

    "msg": "aaa is no.3"

}

ok: [192.168.15.10] => (item={'key': u'bbb', 'value': }) => {

    "msg": "bbb is no.4"

}

ok: [192.168.15.10] => (item={'key': u'ccc', 'value': }) => {

    "msg": "ccc is no.5"

}

TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item=[u'aaa', ]) => {

    "msg": "aaa is no.3"

}

ok: [192.168.15.10] => (item=[u'America', ]) => {

    "msg": "America is no.2"

}

ok: [192.168.15.10] => (item=[u'bbb', ]) => {

    "msg": "bbb is no.4"

}

ok: [192.168.15.10] => (item=[u'ccc', ]) => {

    "msg": "ccc is no.5"

}

ok: [192.168.15.10] => (item=[u'China', ]) => {

    "msg": "China is no.1"

}

PLAY RECAP **********************************************************************************************

192.168.15.10              : ok=    changed=    unreachable=    failed=    skipped=  

debug cycle dict2items -------------------------------------------------- .26s

debug cycle ------------------------------------------------------------- .22s

Playbook finished: Mon Dec  :: ,  total tasks.  :: elapsed.

【Ansible】ansible循环的更多相关文章

  1. Ansible的循环

    Ansible的循环 1.       前言 有可能在一个任务中,可能要做很多事情,例如创建多个用户,安装很多个包等,那么就有可能用到循环. 2.       标准循环 重复的任务可以用下面的方式: ...

  2. ansible Ansible Galaxy ansible-playbook 安装 使用 命令 笔记 生成密钥 管控机 被管控机 wget epel源

    笔记 ansible 安装 与salt对比 相同 都是为了同时在多台机器上执行相同的命令 都是python开发 不同 agent(saltstack需要安装.ansible不需要) 配置(salt配置 ...

  3. Ansible Playbook 循环

    Standard Loops 为了节省一些打字,重复的任务可以写成如下: - name: add several users user: name: "{{ item }}" st ...

  4. Ansible playbook循环实践总结<一>

    1.标准Loops 标准loops可以直接减少task的次数,如下: [root@zero01 playbook]# vi loops.yaml --- - hosts: all gather_fac ...

  5. 自动运维:Ansible -ansible tower

    文档主页:http://docs.ansible.com/参考文档:http://docs.ansible.com/ansible/参考文档:http://docs.ansible.com/ansib ...

  6. Ansible系列(六):循环和条件判断

    本文目录:1. 循环 1.1 with_items迭代列表 1.2 with_dict迭代字典项 1.3 with_fileglob迭代文件 1.4 with_lines迭代行 1.5 with_ne ...

  7. ansible笔记(14):循环(一)

    在使用ansible的过程中,我们经常需要处理一些返回信息,而这些返回信息中,通常可能不是单独的一条返回信息,而是一个信息列表,如果我们想要循环的处理信息列表中的每一条信息,我们该怎么办呢?这样空口白 ...

  8. Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件

    一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...

  9. Ansible详解(二)

    Ansible系列命令 Ansible系列命令有如下: ansible:这个命令是日常工作中使用率非常高的命令之一,主要用于临时一次性操作: ansible-doc:是Ansible模块文档说明,针对 ...

  10. Ansible系列(五):playbook应用和roles自动化批量安装示例

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

随机推荐

  1. [SDOI2010]Hide and Seek

    题目 非常显然就是求一下距离每一个点曼哈顿距离最近的点和最远的点就好了 最远点非常好算,我们建完\(kd-tree\)之后直接暴力就好了 找最近点的时候会有这样一个问题,就是自己找到了自己 所以我们需 ...

  2. 清除SQL server 记住的用户名和密码

    公司更换电脑,清除SQL server 记住的用户名和密码 请按照上图中的位置找到相应的文件SqlStudio.bin,然后把它删除,请放一百个心,这个文件会自动生成的. 需要注意的是,在删除之前一定 ...

  3. kubenetes master使用curl 操作API

    前提条件: 已经使用kubeadm 安装集群 查看 kebelet.conf 配置内容 kubectl --kubeconfig /etc/kubernetes/kubelet.conf config ...

  4. ethereumjs/ethereumjs-account-2-test

    ethereumjs-account/test/index.js const Account = require('../index.js') const tape = require('tape') ...

  5. 初识Qt文字绘制

    1.新建一个Qt Gui应用,项目名称为myDraw,基类选择为QMainWindow,类名设置为MainWindow. 2.在mainwindow.h头文件中添加void paintEvent(QP ...

  6. bootstrap组件-导出数据

    一.需求:在我们日常工作的时候,对数据的导出有需求.比如导出JSON.XML.SQL等形式.方便我们日常使用. 二.组件:我们可以使用bootstrap的扩展插件Table Export来实现我们的需 ...

  7. Linux下如何查看分区文件系统类型

    1,fdisk -l fdisk -l 只能列出硬盘的分区表.容量大小以及分区类型,但看不到文件系统类型. 2,df -h df 命令是用来查看文件系统磁盘空间使用量的.但df 命令只会列出已挂载的文 ...

  8. NRF52832初步使用

    开发环境搭建 开发环境涉及到协议栈SDK版本.keil PACK版本的匹配问题,目前测试通过的环境如下: windows系统:win10 硬件:NRF52832测试板.JLINK-V8仿真器 Keil ...

  9. 微信小程序页面传多个参数

    在需要页面之间传递多个参数的时候,需要用&链接起来,上一页的正确跳转代码如下: var that = this; wx.navigateTo({ url: '../../pages/myLis ...

  10. [2016北京集训试题14]股神小D-[LCT]

    Description Solution 将(u,v,l,r)换为(1,u,v,l)和(2,u,v,r).进行排序(第4个数为第一关键字,第1个数为第二关键字).用LCT维护联通块的合并和断开.(维护 ...