Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html


1. 循环

ansible中的循环都是借助迭代来实现的。基本都是以"with_"开头。以下是常见的几种循环。

1.1 with_items迭代列表

ansibel支持迭代功能。例如,有一大堆要输出的命令、一大堆要安装的软件包、一大堆要copy的文件等等。

例如,要安装一堆软件包。

---- hosts: localhosttasks: - yum: name="{{item}}" state=installedwith_items: - pkg1- pkg2- pkg3

它会一个一个迭代到特殊变量"{{item}}"处。

再例如,指定一堆文件列表,然后使用grep搜索出给定文件列表中包含"www.example.com"字符串的文件:

---- hosts: localhosttasks: - shell: grep -Rl "www\.example\.com" "{{item}}"with_items: - file1- file2- file3register: match_file- debug: msg="{% for i in match_file.results %} {{i.stdout}} {% endfor %}"

注意,将with_items迭代后的结果注册为变量时,其注册结果也是列表式的,且其key为"results"。具体的结果比较长,可以使用debug模块的var或msg参数观察match_file变量的结果。

在上面,是使用for循环进行引用的。如果不使用for循环,那么就需要使用数组格式。例如,引用match_file中的第一和第二个结果。

 - debug: var=match_file.results[0].stdout- debug: var=match_file.results[1].stdout

显然,不如循环引用更好,因为不知道match_file中到底有几个匹配文件,也就不能确定match_file中的列表数量。

每个列表项中可能都包含一个或多个字典,既然with_items迭代的是列表项,那么肯定也能迭代列表中的各字典。

例如:

tasks:- command: echo {{ item }}with_items: [ 0, 2, 4, 6, 8, 10 ]register: num- debug: msg="{% for i in num.results %} {{i.stdout}} {% endfor %}"

再例如:

---- hosts: localhosttasks: - shell: echo "name={{item.name}},age={{item.age}}"with_items: - {name: zhangsan,age: 32}- {name: lisi,age: 33}- {name: wangwu,age: 35}register: who- debug: msg="{% for i in who.results %} {{i.stdout}} {% endfor %}"

1.2 with_dict迭代字典项

使用"with_dict"可以迭代字典项。迭代时,使用"item.key"表示字典的key,"item.value"表示字典的值。

例如:

---- hosts: localhosttasks:- debug: msg="{{item.key}} & {{item.value}}"with_dict: { address: 1,netmask: 2,gateway: 3 }

另一种情况,字典是已存储好的。例如ansible facts中的ansible_eth0.ipv4,其内容如下:

"ipv4": {"address": "192.168.100.65","netmask": "255.255.255.0","gateway": "192.168.100.2"
}

这种情况下,with_dict处可以直接指定该字典的key。即:

---- hosts: localhosttasks:- debug: msg="{{item.key}} & {{item.value}}"with_dict: ansible_eth0.ipv4

再例如,直接引用playbook中定义的vars。

---- hosts: 192.168.100.65gather_facts: Falsevars:user: longshuai_key: name: longshuaigender: Malexiaofang_key: name: xiaofanggender: Femaletasks:- name: print hash loop vardebug: msg="{{ item.key }} & {{ item.value.name }} & {{ item.value.gender }}"with_dict: "{{ user }}"

1.3 with_fileglob迭代文件

例如,拷贝一堆用通配符匹配出来的文件到各远程主机上。

---- hosts: centostasks: - copy: src="{{item}}" dest=/tmp/with_fileglob:- /tmp/*.sh- /tmp/*.py

注意,通配符无法匹配"/",因此无法递归到子目录中,也就无法迭代子目录中的文件。

1.4 with_lines迭代行

with_lines很好用,可以将命令行的输出结果按行迭代。

例如,find一堆文件出来,copy走。

---- hosts: localhosttasks:- copy: src="{{item}}" dest=/tmp/yamlwith_lines:- find /tmp -type f -name "*.yml"

1.5 with_nested嵌套迭代

嵌套迭代是指多次迭代列表项。例如:

---- hosts: localhosttasks:- debug: msg="{{item[0]}} & {{item[1]}}"with_nested: - [a,b]- [1,2,3]

结果将得到"a & 1"、"a & 2"、"a & 3"、"b & 1"、"b & 2"和"b & 3"共6个结果。

2. 条件判断

在ansible中,只有when可以实现条件判断。

tasks: - name: config the yum repo for centos 6yum_repository:name: epeldescription: epelbaseurl: http://mirrors.aliyun.com/epel/6/$basearch/gpgcheck: nowhen: ansible_distribution_major_version == "6"

注意两点:

  • when判断的对象是task,所以和task在同一列表层次。它的判断结果决定它所在task是否执行,而不是它下面的task是否执行。
  • when中引用变量的时候不需要加{{ }}符号。

此外,还支持各种逻辑组合。

tasks:# 逻辑或- command: /sbin/shutdown -h nowwhen: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or(ansible_distribution == "Debian" and ansible_distribution_major_version == "7")# 逻辑与- command: /sbin/shutdown -t nowwhen:- ansible_distribution == "CentOS"- ansible_distribution_major_version == "6"# 取反- command: /sbin/shutdown -t nowwhen: not ansible_distribution == "CentOS"

还可以直接直接引用布尔值的变量。

---- hosts: localhostvars:epic: Falsetasks:- debug: msg="This certainly is epic!"when: not epic

此外,可以使用jinja2的defined来测试变量是否已定义,使用undefined可以取反表示未定义。例如:

tasks:- shell: echo "I've got '{{ foo }}' and am not afraid to use it!"when: foo is defined- fail: msg="Bailing out. this play requires 'bar'"when: bar is undefined

转载于:https://www.cnblogs.com/f-ck-need-u/p/7575228.html

Ansible系列(六):循环和条件判断相关推荐

  1. 事实、循环、条件判断

    文章目录 事实.循环.条件判断 1.描述Ansible事实 2.ansible事实作为变量注入 3.关闭事实收集 4.创建自定义事实 5.魔法变量 6.利用循环迭代任务 7.循环散列或字典列表 8.较 ...

  2. Python基础---循环、条件判断

    循环.条件判断: 条件判断: 每条if语句的核心都是一个值为True或False的表达式 通常情况下,if条件判断配合for循环,while循环使用 语法:if ... 如果满足if后的判断条件,则执 ...

  3. oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...

    PL/SQL入门教程目录 Oracle PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 一.PL/SQL简介 1.PL/SQL简介 1.PL/SQl是过程语言PL与结构化语言 ...

  4. ansible介绍、安装、远程执行命令、拷贝文件或目录、远程执行脚本、管理任务计划、安装包和管理服务、playbook、变量、循环、条件判断、handlers、安装nginx、管理配置文件

    24.15 ansible介绍 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系 ...

  5. 无字天书之Python第六页(条件判断与循环)

    内容大体 传送门 条件判断 if-else if-elif-else 分支语句嵌套 循环语句 简单while while死循环 for循环 range()函数 循环中断 break continue ...

  6. c语言for循环多条件判断,解决在for循环内判断条件多次执行

    最近遇到的这个问题,就是在for循环内if判断的条件会多次执行. 例如,在返回的30数据中,a条目是第7条则会进行30次判断,弹出29次查无数据,也就是要点击29次关闭alert,很是让人不爽. 有了 ...

  7. linux循环判断输出结果,Linux Shell基础学习——循环与条件判断

    for循环 1. 注意do必须换行 for i in {1..10} do echo $i done 2. 注意do必须换行 for i in 1 2 3 4 5 do echo $i done 3. ...

  8. 在c51语言的循环语句中 用作循环结束,在C51语言的循环语句中,用作循环结束条件判断的表达式为()...

    的任营领域都个战企业为结何一合的略经是以,语言用作战略经营须综合考领域虑这两个分析方面时必,. 循的表达式的一参与资产战略个以共同个独企业企业建立就是或两两个立的联盟上的. 环语对方的盟就盟各一家业( ...

  9. 六、 PHP8 条件判断(match)

    1. 三元运算符 $name = '晴' echo $name ? $name:null; 2. if $is=true; if($is){var_dump($is); } 3.if else $is ...

最新文章

  1. Servlet 2.0 Servlet 3.0 新特性
  2. Linux下配置SSL (转)
  3. python包导入方式_python导包的几种方法(自定义包的生成以及导入详解)
  4. 元宇宙这把火开始烧向打工人
  5. 常用正则表达式,来自新浪微博的js
  6. 两轮差速机器人舵机转轴示意图_机器人教程2:舵机及转向控制原理
  7. 【嵌入式实验】《嵌入式开发工具使用》
  8. XP系统中如何查哪些网址曾经远程连接过本机器。
  9. linux以http方式搭建git服务器
  10. Eclipse SVN插件Subclipse和Subversive简介
  11. 【电脑使用】插入SD卡图标是灰色的,点击显示“请将磁盘插入驱动器”
  12. 小学计算机的一些课题,小学信息技术小课题研究.doc
  13. 高并发大流量,大麦抢票的技术涅槃之路
  14. 双耳节拍 枕头_枕头2.2.1发布
  15. Python数据分析与处理——处理中国地区信息
  16. php主机卫士,Bypass 360主机卫士SQL注入防御(多姿势)
  17. pygame 学习笔记(7)添加一个精灵:坦克的移动和旋转
  18. 搜索技巧——奇偶剪纸
  19. VAD语音分割算法原理与简单实现
  20. 如何在电脑上保存微信公众号文章封面图片?

热门文章

  1. [实变函数]4.4 依测度收敛
  2. 好文转载 Linux环境进程间通信(五): 共享内存(上)
  3. 用Access的iif代替SQL中的IsNull()
  4. hdu 1116 Play on Words
  5. 类型初始值设定项引发异常
  6. R语言shiny包运行runApp()报错的解决
  7. 连接被远程计算机621,拨号上网常见错误代码提示及解决方法
  8. 阻止路由跳转得方式_vue路由拦截及页面跳转的设置方法
  9. matlab高斯消去,高斯消去、追赶法 matlab
  10. influxdb tsm文件_利用InfluxDB+Grafana搭建Flink on YARN作业监控大屏