【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 ...
随机推荐
- 常用的npm命令
npm ls -g 列出全局安装的所有模块 npm ls webpack -g 查看全局安装的模块版本信息 npm view webpack versions 查看npm服务器上的全部版本信息 npm ...
- 1854. [SCOI2010]游戏【二分图】
Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性 ...
- 【转】Spring Boot干货系列:(六)静态资源和拦截器处理
前言 本章我们来介绍下SpringBoot对静态资源的支持以及很重要的一个类WebMvcConfigurerAdapter. 正文 前面章节我们也有简单介绍过SpringBoot中对静态资源的默认支持 ...
- 学习笔记——并行编程Parallel
Parallel 并行运算 参考资料:http://www.cnblogs.com/woxpp/p/3925094.html 1.并行运算 使用Parallel并行运算时,跟task很像,相当于tas ...
- 编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数。定义 Gymnastics 类和 School 类,它们都是 ComputerAverage 的子类。Gymnastics 类中计算选手的平均成绩的方法是去掉一个最低分,去掉一个最高分,然后求平均分;School 中计算平均分的方法是所有科目的分数之和除以总科目数。 要求:定义ComputerAv
题目: 编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数. 定义 Gymnastics 类和 School 类,它们都是 ComputerAverag ...
- Beautiful Report 异步并发测试html报告
version_ :python3.7 下载BeautifulReport https://github.com/TesterlifeRaymond/BeautifulReport/archive ...
- nagios client 端的安装配置 以及 svr端对应的配置(转)
1.下载安装包并解压 $ wget wget http://www.nagios-plugins.org/download/nagios-plugins-2.1.1.tar.gz$ wget http ...
- Linux虚拟机下安装Oracle 11G教程
1.安装环境 操作系统:Red hat 6.5 内存:内存最低要求256M (使用:grep MemTotal /proc/meminfo 命令查看) 交换空间:SWAP交换空间大小根据内存大小决定( ...
- 笔记:iOS字符串的各种用法(字符串插入、字符串覆盖、字符串截取、分割字符串)(别人的代码直接复制过来的,我脸皮有点厚)
NSString* str=@"hello";//存在代码区,不可变 NSLog(@"%@",str); //1.[字符串插入] NSMutableString ...
- 5分钟速成C++14多线程编程
原文链接:Learn C++ Multi-Threading in 5 Minutes C++14的新的多线程架构非常简单易学,如果你对C或者C++很熟悉,那么本文非常适合你.作者用C++14作为基准 ...