Ansible系列(六):循环和条件判断
我写了更完善的Ansible专栏文章:一步到位玩儿透Ansible
Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
1. 循环
ansible中的循环都是借助迭代来实现的。基本都是以"with_"开头。以下是常见的几种循环。
1.1 with_items迭代列表
ansibel支持迭代功能。例如,有一大堆要输出的命令、一大堆要安装的软件包、一大堆要copy的文件等等。
例如,要安装一堆软件包。
---
- hosts: localhost
tasks:
- yum: name="{{item}}" state=installed
with_items:
- pkg1
- pkg2
- pkg3
它会一个一个迭代到特殊变量"{{item}}"处。
再例如,指定一堆文件列表,然后使用grep搜索出给定文件列表中包含"www.example.com"字符串的文件:
---
- hosts: localhost
tasks:
- shell: grep -Rl "www\.example\.com" "{{item}}"
with_items:
- file1
- file2
- file3
register: 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: localhost
tasks:
- 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: localhost
tasks:
- 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: localhost
tasks:
- debug: msg="{{item.key}} & {{item.value}}"
with_dict: ansible_eth0.ipv4
再例如,直接引用playbook中定义的vars。
---
- hosts: 192.168.100.65
gather_facts: False
vars:
user:
longshuai_key:
name: longshuai
gender: Male
xiaofang_key:
name: xiaofang
gender: Female
tasks:
- name: print hash loop var
debug: msg="{{ item.key }} & {{ item.value.name }} & {{ item.value.gender }}"
with_dict: "{{ user }}"
1.3 with_fileglob迭代文件
例如,拷贝一堆用通配符匹配出来的文件到各远程主机上。
---
- hosts: centos
tasks:
- copy: src="{{item}}" dest=/tmp/
with_fileglob:
- /tmp/*.sh
- /tmp/*.py
注意,通配符无法匹配"/",因此无法递归到子目录中,也就无法迭代子目录中的文件。
1.4 with_lines迭代行
with_lines很好用,可以将命令行的输出结果按行迭代。
例如,find一堆文件出来,copy走。
---
- hosts: localhost
tasks:
- copy: src="{{item}}" dest=/tmp/yaml
with_lines:
- find /tmp -type f -name "*.yml"
1.5 with_nested嵌套迭代
嵌套迭代是指多次迭代列表项。例如:
---
- hosts: localhost
tasks:
- 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 6
yum_repository:
name: epel
description: epel
baseurl: http://mirrors.aliyun.com/epel/6/$basearch/
gpgcheck: no
when: ansible_distribution_major_version == "6"
注意两点:
- when判断的对象是task,所以和task在同一列表层次。它的判断结果决定它所在task是否执行,而不是它下面的task是否执行。
- when中引用变量的时候不需要加{{ }}符号。
此外,还支持各种逻辑组合。
tasks:
# 逻辑或
- command: /sbin/shutdown -h now
when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or
(ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
# 逻辑与
- command: /sbin/shutdown -t now
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == "6"
# 取反
- command: /sbin/shutdown -t now
when: not ansible_distribution == "CentOS"
还可以直接直接引用布尔值的变量。
---
- hosts: localhost
vars:
epic: False
tasks:
- 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
Ansible系列(六):循环和条件判断的更多相关文章
- python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 1. 创建一个 zqxt_tm ...
- Ansible 小手册系列 十四(条件判断和循环)
条件判断 When 语句 在when 后面使用Jinja2 表达式,结果为True则执行任务. tasks: - name: "shut down Debian flavored syste ...
- ansible 循环与条件判断when
普通循环 with_itemes 变量组 { item } 循环变量 示例 - name: 覆盖配置文件 copy: src=/root/{{ item }} dest=/root/test/{{ i ...
- Ansible系列(六):各种变量定义方式和变量引用
本文目录:1.1 ansible facts1.2 变量引用json数据的方式 1.2.1 引用json字典数据的方式 1.2.2 引用json数组数据的方式 1.2.3 引用facts数据1.3 设 ...
- PHP和JS在循环、条件判断中的不同之处
一.条件判断: php中算 false 的情况 1. boolean:false 2. 整形:0 3.浮点型:0 4.字符串:"" "0"(其他都对) 5.空 ...
- Java 控制语句:循环、条件判断
基础很重要,基础很重要,基础很重要.重要的事情说三遍,. 程序设计中的控制语句主要有三种:顺序.分支和循环.我们每天写的代码,除了业务相关,里面会包含大量的控制语句.但是控制语句的基本使用,是否有些坑 ...
- shell专题(六):条件判断
1.基本语法 [ condition ](注意condition前后要有空格) 注意:条件非空即为true,[ atguigu ]返回true,[] 返回false. 2. 常用判断条件 (1)两个整 ...
- Go语言之循环与条件判断
一.for循环 Go 语言中没有 while 循环,只有一个 for 循环 for 变量初始化;条件;变量自增/自减 { 循环体内容 } 1.基本使用 for i := 0; i < 10; i ...
- Shell系列(28)- 条件判断之字符串判断
字符串判断 $变量时要用双引号引起来,即"$变量" 测试选项 作用 -z 字符串 判断字符串是否为空(为空返回真) -n 字符串 判断字符串是否为非空(非空返回真) 字符串1 == ...
随机推荐
- 【Java学习笔记之二十八】深入了解Java8新特性
前言: Java8 已经发布很久了,很多报道表明java8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java 8 ...
- multisim&proteus&protel比较
Multisim有超强板级的模拟/数字电路板的设计工作.它包含了电路原理图的图形输入.电路硬件描述语言输入方式,具有丰富的仿真分析能力.高版本可 以进行单片机等MCU的仿真.Multisim有实际元器 ...
- 归并排序—Java版
一开始做算法的时候,感觉递归算法很绕,所以我就在阅读别人代码的基础上,对代码每一步都添加自己的注解,方便我以后的学习. public class MergeSort { /** * 归并排序 * @p ...
- FileProvider解决FileUriExposedException
FileUriExposedException 在给app做版本升级的时候,先从服务器下载新版本的apk文件到sdcard路径,然后调用安装apk的代码,一般写法如下: private void op ...
- Java起源
Java历史发展和特点 作为一名合格的程序员,如果不了解一些关于Java语言的起源是有一些不太合适的.下面就介绍一下我所了解的Java起源. 1.Java名字的来源 Java是印度尼西亚爪哇岛的英文名 ...
- mysql:Linux系统下mysql5.6的安装卸载
1.1. 下载rpm包 要使用yum 安装mysql,需要mysql的yum仓库,先从官网下载适合你系统的仓库 http://dev.mysql.com/downloads/repo/yum/ 我的是 ...
- ADO.NET的学习
ADO.NET的几个对象 Connection:管理数据库的连接 Command:对数据库执行命令 DataReader:数据流读取器,返回的数据都是快速的且只是"向前"的数据流. ...
- poj 3592 缩点+SPFA
题意:给出一个矩阵,其中#代表墙,不可走,0-9代表权值,*代表可以选择传送.求从0,0点开始出发能获得最大权值. 思路:因为*的出现会有环的情况,先建图连边,将环进行Tarjan缩点,之后再从0,0 ...
- js实现换肤效果
一,js换肤的基本原理 基本原理很简单,就是使用 JS 切换对应的 CSS 样式表文件.例如导航网站 Hao123 的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 ...
- Js函数初学者练习(一)switch-case结构实现计算器。
前 言 JRedu 给大家介绍一点JS函数的练习题希望初学者多做一些练习能够更好的掌握JS的函数,以及能够提升大家的逻辑思维.(我也是个渣渣希望路过的大神多提建议或意见) 希望能够对大家有所帮助 ...