【Ansible】ansible循环
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循环的更多相关文章
- Ansible的循环
		
Ansible的循环 1. 前言 有可能在一个任务中,可能要做很多事情,例如创建多个用户,安装很多个包等,那么就有可能用到循环. 2. 标准循环 重复的任务可以用下面的方式: ...
 - ansible Ansible Galaxy  ansible-playbook 安装 使用 命令  笔记   生成密钥  管控机 被管控机  wget  epel源
		
笔记 ansible 安装 与salt对比 相同 都是为了同时在多台机器上执行相同的命令 都是python开发 不同 agent(saltstack需要安装.ansible不需要) 配置(salt配置 ...
 - Ansible Playbook 循环
		
Standard Loops 为了节省一些打字,重复的任务可以写成如下: - name: add several users user: name: "{{ item }}" st ...
 - Ansible playbook循环实践总结<一>
		
1.标准Loops 标准loops可以直接减少task的次数,如下: [root@zero01 playbook]# vi loops.yaml --- - hosts: all gather_fac ...
 - 自动运维:Ansible -ansible tower
		
文档主页:http://docs.ansible.com/参考文档:http://docs.ansible.com/ansible/参考文档:http://docs.ansible.com/ansib ...
 - Ansible系列(六):循环和条件判断
		
本文目录:1. 循环 1.1 with_items迭代列表 1.2 with_dict迭代字典项 1.3 with_fileglob迭代文件 1.4 with_lines迭代行 1.5 with_ne ...
 - ansible笔记(14):循环(一)
		
在使用ansible的过程中,我们经常需要处理一些返回信息,而这些返回信息中,通常可能不是单独的一条返回信息,而是一个信息列表,如果我们想要循环的处理信息列表中的每一条信息,我们该怎么办呢?这样空口白 ...
 - Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件
		
一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...
 - Ansible详解(二)
		
Ansible系列命令 Ansible系列命令有如下: ansible:这个命令是日常工作中使用率非常高的命令之一,主要用于临时一次性操作: ansible-doc:是Ansible模块文档说明,针对 ...
 - Ansible系列(五):playbook应用和roles自动化批量安装示例
		
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
 
随机推荐
- Kubernetes-dns 域名解析问题
			
问题描述:nginx不能解析域名,但是使用nslookup却可以解析域名 ./sbin/nginx -t nginx: [emerg] host not found in upstream " ...
 - 【洛谷】【线段树】P1886 滑动窗口
			
[题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...
 - 【openjudge】【递推】例3.6 过河卒(Noip2002)
			
[题目描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1 ...
 - snip
			
首先明确物体太小太大都不好检测(都从roi的角度来分析): 1.小物体: a.本身像素点少,如果从anchor的点在gt像素内来说,能提取出来的正样本少 b.小物体会出现iou过低.具体来说 ...
 - leetcode 141. Linked List Cycle 、 142. Linked List Cycle II
			
判断链表有环,环的入口结点,环的长度 1.判断有环: 快慢指针,一个移动一次,一个移动两次 2.环的入口结点: 相遇的结点不一定是入口节点,所以y表示入口节点到相遇节点的距离 n是环的个数 w + n ...
 - 《数据结构算法分析C描述》引论:选择问题,字谜游戏问题
			
#include <stdio.h> #include <stdlib.h> // 第一题 // 找出N个数的第k个最大者 // 方法1:排序(冒泡),降序找出第k个值 // ...
 - Xcode下载模拟器太慢?
			
在Xcode里下载模拟器,速度实在是太慢了.点击下载,卡住十几分钟才开始下载,并且龟速进行. 解决方案:获取模拟器下载地址,自己选择下载器进行下载. 找到下载链接 打开 Console.app(苹果电 ...
 - STM32中EXTI和NVIC的关系
			
(1)NVIC(嵌套向量中断):NVIC是Cortex-M3核心的一部分,关于它的资料不在<STM32的技术参考手册>中,应查阅ARM公司的<Cortex-M3技术参考手册>C ...
 - 托管代码编写mssql存储过程
			
参考:http://wenku.it168.com/d_000642903.shtml 打开vs,创建数据库项目,添加新项,选择sql clr c#, 选择存储过程. 样例: [Microsoft.S ...
 - 20145209刘一阳《JAVA程序设计》第六周课堂测试
			
第六周课堂测试 1.现有以下代码,哪些选项插入到第5行可以通过编译?(BDF) 1.import java.util.*; 2. 3.Class FindStuff { 4.public static ...