一、前言
在ansible-playbook中,也可以像其他编程语言一样进行条件判断、循环等流程控制。除此之外,还可以控制task的执行结果。
在ansible中,可以通过when语句来执行条件判断。只有符合条件,才会执行对应的task。when语句和task对齐,在when语句中,变量不需要使用{{ }}括起来。
条件语句在Ansible中的使用场景:
1、在目标主机上定义了一个硬限制,比如:目标主机的发行版本必须是Centos,才能执行该task;
2、捕获一个命令的输出,根据命令输出结果的不同以触发不同的task;
3、根据不同目标主机的变量,以定义不同的task;
4、根据目标机的cpu或内存的大小,对相关应用性能进行调优;
5、用于判断某个服务的配置文件是否发生变更,以确定是否需要重启服务等。
二、常用判断运算符
2.1、比较运算符
==:比较两个对象是否相等,相等则返回真。可用于比较字符串和数字
!=:比较两个对象是否不等,不等则为真
>:比较两个对象的大小,左边的值大于右边的值,则为真
<:比较两个对象的大小,左边的值小于右边的值,则为真
=:比较两个对象的大小,左边的值大于等于右边的值,则为真
<=:比较两个对象的大小,左边的值小于等于右边的值,则为真
2.2、逻辑运算符
and:逻辑与,当左边和右边两个表达式同时为真,则返回真
or:逻辑或,当左右和右边两个表达式任意一个为真,则返回真
not:逻辑否,对表达式取反
():当一组表达式组合在一起,形成一个更大的表达式,组合内的所有表达式都是逻辑与的关系
三、常用判断类型
3.1、判断变量
defined :判断变量是否已经定义,已经定义则返回真
undefind :判断变量是否已经定义,未定义则返回真
none :判断变量值是否为空,如果变量已经定义,但是变量值为空,则返回真
示例一:
service变量定义,但是没有赋值,如下图所示:
判断service变量是否为空,如下图所示:
执行结果,如下图所示:
3.2、判断路径
file : 判断路径是否是一个文件,如果路径是一个文件则返回真
directory :判断路径是否是一个目录,如果路径是一个目录则返回真
link :判断路径是否是一个软链接,如果路径是一个软链接则返回真
mount:判断路径是否是一个挂载点,如果路径是一个挂载点则返回真
exists:判断路径是否存在,如果路径存在则返回真
示例一:
test变量定义,如下图所示:
判断/opt/pkgs/readme.txt路径是否存在,如下图所示:
执行结果,如下图所示:
3.3、判断字符串
lower:判断包含字母的字符串中的字母是否是纯小写,字符串中的字母全部为小写则返回真
upper:判断包含字母的字符串中的字母是否是纯大写,字符串中的字母全部为大写则返回真
示例一:
test1和test2变量定义,如下图所示:
判断变量test1变量的值是否为纯小写字母,判断test2变量的值是否为纯大写字母,如下图所示:
执行结果,如下图所示:
3.4、判断整除
even :判断数值是否是偶数,是偶数则返回真
odd :判断数值是否是奇数,是奇数则返回真
divisibleby(num) :判断是否可以整除指定的数值,如果除以指定的值以后余数为0,则返回真
示例一:
num1、num2、num3变量定义,如下图所示:
判断变量num1的值是否为偶数,判断变量num2的值是否为奇数,判断num3变量的值除以8,余数是否为0,如下图所示:
执行结果,如下图所示:
3.5、判断执行结果
success或succeeded:通过任务的返回信息判断任务的执行状态,任务执行成功则返回真
failure或failed:通过任务的返回信息判断任务的执行状态,任务执行失败则返回真
change或changed:通过任务的返回信息判断任务的执行状态,任务执行状态为changed则返回真
skip或skipped:通过任务的返回信息判断任务的执行状态,当任务没有满足条件,而被跳过执行时,则返回真
示例一:
service、mysql变量定义,如下图所示:
判断mysql服务端口是否正常,如下图所示:
执行结果,如下图所示:
3.6、其它判断
示例一:
判断mysql服务端口是否正常,如下图所示:
执行结果,如下图所示:
示例二:
ver1和ver2变量,如下图所示:
判断ver1变量的值是否大于ver2变量的值,如下图所示:
执行结果,如下图所示:
四、多条件判断
示例一:
# 逻辑与
when: ansible_disibution == "CentOS" and ansible_disibution_major_vsion == "7"
# 逻辑或
when: ansible_disibution == "RedHat" or ansible_disibution == "Fedora"
when:
- ansible_disibution_vsion == "7.9"
- ansible_kernel == "3.10.0-327.el7.x86_64"
# 组合使用
when: =>
( ansible_disibution == "RedHat" and ansible_disibution_major_vsion == "7" )
or
( ansible_disibution == "Fedora" and ansible_disibution_major_vsion == "28")
总结:整理不易,如果对你有帮助,可否点赞关注一下?