7-playbook条件判断

ansible

when

ansible playbook中使用when作为条件判断的关键字,在when使用时后面的变量不加 {{   }}

1
2
3
4
5
6
7
--- 
- hosts : test3
tasks :
- name : 如果目标主机为centos则输出yes
when : ansible_distribution == "CentOS" #ansible_distribution表示目标主机系统的发行版
debug :
msg : "yes"

表示若ansible_distribution为CentOS,则将会调用debug模块;若不是,则不会调用。
when

运算符

比较运算符
==:比较两个对象是否相等,相等为真
!=:比较两个对象是否不等,不等为真
> :比较两个值的大小,如果左边的值大于右边的值,则为真
< :比较两个值的大小,如果左边的值小于右边的值,则为真
>=:比较两个值的大小,如果左边的值大于右边的值或左右相等,则为真
<=:比较两个值的大小,如果左边的值小于右边的值或左右相等,则为真
逻辑运算符
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}}"

ignore_errors

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"

tests
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 #注意when对齐的位置,该when是对应整个block的

block

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
rescue中可以定义多个任务

always

always关键字,无论block中的任务执行成功还是失败,always中的任务都会被执行。

1
2
3
4
5
6
7
8
---
- hosts : test3
tasks :
- block :
- shell : ls /asd
always :
- debug :
msg : block 块任务结束

always

fail

fail模块,将任务标记为失败终止playbook,一般会与when一起使用退出playbook执行。

1
2
3
4
5
6
7
8
9
---
- hosts : test3
tasks :
- debug :
msg : 任务一
- fail :
msg : 任务二fail模块输出
- debug :
msg : 任务三

fail

failed_when

表示符合条件时,将任务标记为失败终止playbook

1
2
3
4
5
6
7
---
- hosts : test3
tasks :
- debug :
msg : error
register : result
failed_when : result.msg == "error"

failed_when

changed_when

failed_when类似,符合条件时将任务状态标记为changed