一、前言

在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变量定义,但是没有赋值,如下图所示:

ansible 开启和停止服务 ansible when in_ansible 开启和停止服务

判断service变量是否为空,如下图所示:

ansible 开启和停止服务 ansible when in_字符串_02

执行结果,如下图所示:

ansible 开启和停止服务 ansible when in_ansible 开启和停止服务_03


3.2、判断路径

file : 判断路径是否是一个文件,如果路径是一个文件则返回真
directory :判断路径是否是一个目录,如果路径是一个目录则返回真
link :判断路径是否是一个软链接,如果路径是一个软链接则返回真
mount:判断路径是否是一个挂载点,如果路径是一个挂载点则返回真
exists:判断路径是否存在,如果路径存在则返回真

示例一:

test变量定义,如下图所示:

ansible 开启和停止服务 ansible when in_执行状态_04

判断/opt/pkgs/readme.txt路径是否存在,如下图所示:

ansible 开启和停止服务 ansible when in_字符串_05

执行结果,如下图所示:

ansible 开启和停止服务 ansible when in_字符串_06


3.3、判断字符串

lower:判断包含字母的字符串中的字母是否是纯小写,字符串中的字母全部为小写则返回真
upper:判断包含字母的字符串中的字母是否是纯大写,字符串中的字母全部为大写则返回真

示例一:

test1和test2变量定义,如下图所示:

ansible 开启和停止服务 ansible when in_ansible_07

判断变量test1变量的值是否为纯小写字母,判断test2变量的值是否为纯大写字母,如下图所示:

ansible 开启和停止服务 ansible when in_执行状态_08

执行结果,如下图所示:

ansible 开启和停止服务 ansible when in_字符串_09


3.4、判断整除

even :判断数值是否是偶数,是偶数则返回真
odd :判断数值是否是奇数,是奇数则返回真
divisibleby(num) :判断是否可以整除指定的数值,如果除以指定的值以后余数为0,则返回真

示例一:

num1、num2、num3变量定义,如下图所示:

ansible 开启和停止服务 ansible when in_逻辑与_10

判断变量num1的值是否为偶数,判断变量num2的值是否为奇数,判断num3变量的值除以8,余数是否为0,如下图所示:

ansible 开启和停止服务 ansible when in_逻辑与_11

执行结果,如下图所示:

ansible 开启和停止服务 ansible when in_执行状态_12


3.5、判断执行结果

success或succeeded:通过任务的返回信息判断任务的执行状态,任务执行成功则返回真
failure或failed:通过任务的返回信息判断任务的执行状态,任务执行失败则返回真
change或changed:通过任务的返回信息判断任务的执行状态,任务执行状态为changed则返回真
skip或skipped:通过任务的返回信息判断任务的执行状态,当任务没有满足条件,而被跳过执行时,则返回真

示例一:

service、mysql变量定义,如下图所示:

ansible 开启和停止服务 ansible when in_ansible_13

判断mysql服务端口是否正常,如下图所示:

ansible 开启和停止服务 ansible when in_ansible 开启和停止服务_14

执行结果,如下图所示:

ansible 开启和停止服务 ansible when in_ansible_15


3.6、其它判断

示例一:

判断mysql服务端口是否正常,如下图所示:

ansible 开启和停止服务 ansible when in_执行状态_16

执行结果,如下图所示:

ansible 开启和停止服务 ansible when in_执行状态_17


示例二:

ver1和ver2变量,如下图所示:

ansible 开启和停止服务 ansible when in_执行状态_18

判断ver1变量的值是否大于ver2变量的值,如下图所示:

ansible 开启和停止服务 ansible when in_字符串_19

执行结果,如下图所示:

ansible 开启和停止服务 ansible when in_逻辑与_20


四、多条件判断

示例一:

# 逻辑与
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")

总结:整理不易,如果对你有帮助,可否点赞关注一下?