when
ansible playbook中使用when
作为条件判断的关键字,在when使用时后面的变量不加 {{ }}。
1 2 3 4 5 6 7
| --- - hosts : test3 tasks : - name : 如果目标主机为centos则输出yes when : ansible_distribution == "CentOS" debug : msg : "yes"
|
表示若ansible_distribution为CentOS,则将会调用debug模块;若不是,则不会调用。
运算符
比较运算符
==
:比较两个对象是否相等,相等为真
!=
:比较两个对象是否不等,不等为真
>
:比较两个值的大小,如果左边的值大于右边的值,则为真
<
:比较两个值的大小,如果左边的值小于右边的值,则为真
>=
:比较两个值的大小,如果左边的值大于右边的值或左右相等,则为真
<=
:比较两个值的大小,如果左边的值小于右边的值或左右相等,则为真
逻辑运算符
and
:逻辑与,当左边与右边同时为真,则返回真
or
:逻辑或,当左边与右边有任意一个为真,则返回真
not
:取反,对一个操作体取反
( )
:组合,将一组操作体包装在一起,形成一个较大的操作体
当逻辑运算符为and
时有两种写法
1 2 3 4
| when: a=="1" and b == "1" when : - a=="1" - b == "1"
|
ignore_errors
当前task执行报错,ansible也会忽略这个错误,继续执行playbook;若不使用,则当task报错时该playbook将会运行中断。
1 2 3 4 5 6 7 8 9 10
| --- - hosts : test3 tasks : - name : /ansible/a是一个不存在的路径 shell : ls /ansible/a ignore_errors : true register : result - name : result的相关信息,查看是否执行失败 debug : msg : "{{result.failed}}"
|
tests
tests是jinjia2中的,借助tests可以进行判断操作。
1 2 3 4 5 6 7 8 9
| --- - hosts : test3 vars : testpath : /opt/test tasks : - name : 判断ansible管理端是否有/opt/testtest这个路径 when : testpath exists debug : msg : "{{testpath}} is exists"
|

is exists
是判断ansible管理端主机的路径的,当然也可以使用is not exists
。
判断变量的tests
defined:判断变量是否定义,定义则返回真
undefined:判断变量是否定义,未定义则返回真
none:判断变量是否为空值,若已定义且为空值,则返回真
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| --- - hosts : test3 vars : num1 : 1 num3 : tasks : - name : 判断num1是否定义 when : num1 is defined debug : msg : "num1 is {{num1}}" - name : 判断num2是否定义 when : num2 is undefined debug : msg : "num2 is undefined" - name : 判断num3是否为空值 when : num3 is none debug : msg : "num3 is none"
|
判断执行结果的tests
success或successded:通过任务的返回信息判断任务执行状态,任务执行成功返回真
failure或failed:通过任务的返回信息判断任务执行状态,任务执行失败返回真
change或changed:任务执行状态为change为真
skip或skipped:任务没有满足条件,跳过执行时返回为真
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| --- - hosts : test3 vars : condition : "yes" tasks : - name : 设定一个判断场景 shell : "cat /home/test" when : condition == "yes" register : returnmsg ignore_errors : true - name : 查看执行状态 debug : msg : "{{returnmsg}}" - name : 判断执行结果是否为success when : returnmsg is success debug : msg : "success" - name : 判断执行结果是否为failed when : returnmsg is failure debug : msg : "failure" - name : 判断执行结果是否为change when : returnmsg is change debug : msg : "change" - name : 判断执行结果是否为skip when : returnmsg is skip debug : msg : "skip"
|
判断路径的tests
如下的tests都是针对ansible管理端主机中的路径,与目标主机无关
file : 判断路径是否是一个文件,如果路径是一个文件则返回真
directory :判断路径是否是一个目录,如果路径是一个目录则返回真
link :判断路径是否是一个软链接,如果路径是一个软链接则返回真
mount :判断路径是否是一个挂载点,如果路径是一个挂载点则返回真
exists :判断路径是否存在,如果路径存在则返回真
判断字符串的tests
lower:判断包含字母的字符串中的字母是否是纯小写,字符串中的字母全部为小写则返回真
upper:判断包含字母的字符串中的字母是否是纯大写,字符串中的字母全部为大写则返回真
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| --- - hosts : test3 vars : str1 : "ABC" str2 : "abc" tasks : - name : 判断str1是否全为大写字母 when : str1 is upper debug : msg : "str1全为大写,str1={{str1}}" - name : 判断str2是否全为小写字母 when : str2 is lower debug : msg : "str2全为大写,str1={{str2}}"
|
判断整除的tests
even : 判断数值是否为偶数
odd : 判断数值是否为奇数
divisibleby(NUM):判断是可以被NUM整除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| --- - hosts : test3 vars : num1 : 6 num2 : 3 num3 : 9 tasks : - name : 判断num1是否为偶数 when : num1 is even debug : msg : "num1为{{num1}}是整数" - name : 判断num2是否为偶数 when : num2 is odd debug : msg : "num2为{{num2}}是奇数" - name : 判断num3是否能被3整除 when : num2 is divisibleby(3) debug : msg : "num3为{{num3}}可以被3整除"
|
其他判断的tests
version:可以用于对比两个版本号的大小,或者与指定的版本号进行对比,使用语法为 version(‘版本号’, ‘比较操作符’)
1 2 3 4 5 6 7 8 9 10
| --- - hosts : test3 vars : ver1 : 1.9.12 ver2 : 7.2.21 tasks : - name : 比较两个版本号的大小 when : ver2 is version(ver1,">") debug : msg : "ver2>ver1"
|

大于:>, gt
大于等于:>=, ge
小于:<, lt
**小于等于**:<=, le
**等于**: ==, =, eq
**不等于**:!=, <>, ne
subset:判断一个list是不是另一个list的子集,是另一个list的子集时返回真
superset : 判断一个list是不是另一个list的父集,是另一个list的父集时返回真
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| --- - hosts : test3 vars : a : [1,2,3,4,5] b : [2,3,5] tasks : - name : 输出a与b的值 debug : msg : "a={{a}} b={{b}}" - name : 判断b是否为a的子集 when : b is subset(a) debug : msg : "b 是 a 的子集" - name : 判断a是否为b的父集 when : a is superset(b) debug : msg : "a 是 b 的父集"
|
string:判断对象是否是一个字符串,是字符串则返回真
number:判断对象是否是一个数字,是数字则返回真
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| --- - hosts : test3 vars : var1 : a var2 : "2" var3 : 3 tasks : - name : 判断var1是否为字符串 when : var1 is string debug : msg : "yes" - name : 判断var2是否为字符串 when : var2 is string debug : msg : "yes" - name : 判断var3是否为字符串 when : var3 is string debug : msg : "yes" - name : 判断var1是否为数字 when : var1 is number debug : msg : "yes" - name : 判断var2是否为数字 when : var2 is number debug : msg : "yes" - name : 判断var3是否为数字 when : var3 is number debug : msg : "yes"
|

可以看出数字只有在被双引号引起时才会被认定是一个数字,字符、字符串加不加双引号都被认定为是字符串
block
block
可以将多个任务整合成一个块,这个块将被当做是一个整体,当这个block满足所在的tasks中的条件判断时,这个块里的任务都会被执行。
1 2 3 4 5 6 7 8 9 10 11 12
| --- - hosts : test3 tasks : - name : "学习block" debug : msg : "任务一" - block : - debug : msg : "任务二" - debug : msg : "任务三" when : 1 < 2
|
rescue
block
除了能在符合when条件是执行多个任务,还能与rescue
一同使用,应对block块
中任务出错的场景,当block块
中任务无误时则不会执行
1 2 3 4 5 6 7 8 9 10
| --- - hosts : test3 tasks : - block : - debug : msg : "block块中任务一" - shell : ls /asd rescue : - debug : msg : "block块中某一个任务报错"
|

rescue
中可以定义多个任务
always
always
关键字,无论block中的任务执行成功还是失败,always中的任务都会被执行。
1 2 3 4 5 6 7 8
| --- - hosts : test3 tasks : - block : - shell : ls /asd always : - debug : msg : block 块任务结束
|
fail
fail
模块,将任务标记为失败终止playbook,一般会与when
一起使用退出playbook执行。
1 2 3 4 5 6 7 8 9
| --- - hosts : test3 tasks : - debug : msg : 任务一 - fail : msg : 任务二fail模块输出 - debug : msg : 任务三
|
failed_when
表示符合条件时,将任务标记为失败终止playbook
1 2 3 4 5 6 7
| --- - hosts : test3 tasks : - debug : msg : error register : result failed_when : result.msg == "error"
|
changed_when
与failed_when
类似,符合条件时将任务状态标记为changed