ansible when is 一:单条件、多条件、文件目录、测试结果,变量定义
1、运算符及常用介绍:
1、条件判断中常用的关系运算符:
== 、!=、> 、<、 >=、 <=
2、逻辑运算符:
and 、or、not
3、is
文件或目录是否存在、变量是否定义、任务执行结果(success或failed)、任务是否执行(changed或skipped)、link(软链接)是否存在,mount(挂载点)路径是否
是挂载点;
字符串、数字、集合使用相关:
lower:判断是否是纯大写
upper:判断是否是纯小写
even: 判断是否为偶数
odd: 判断是否为奇数
divisibleby(num) :判断是否可以整除指定的数值,如果除以指定的值以后余数为0,则返回真;
version:版本号比较;version("5,5","gt")
subset:判断一个list是不是另一个list的子集,是另一个list的子集时返回真;
superset : 判断一个list是不是另一个list的父集,是另一个list的父集时返回真;
2、单挑件判断
测试yml
---
- hosts: hostA
tasks:
- name: "准备操作 1"
command: hostname
register: result
- name: "单条件判断 1"
shell: echo "使用前一个task 的输出结果进行判断"
when: result.stdout_lines[0]== "node1"
使用单个条件进行判断,为真得时候执行前面的shell命令;
3、多条件判断
测试yml:
---
- hosts: hostA
tasks:
- name: "准备操作 1"
command: hostname
register: result
- name: "多条件判断 1"
shell: echo "多条件执行成功"
when:
- result.stdout_lines[0] == "node1" and result.rc != 10
多条件之间可以使用逻辑运算进行连接,如:and or nor;
4、文件、目录、软链接、是否为挂载目录、是否存在
如测试yml:
---
- hosts: hostA
tasks:
- name: "是否为目录"
vars:
file_t: /home/user1/bb
debug:
msg: "文件存在"
when: file_t is exists
- name: "是否为文件"
vars:
file_t: /home/user1/bb
debug:
msg: ""
when: file_t is file
- name: "是否为目录"
vars:
dir_t: /home/user1
debug:
msg: ""
when: dir_t is directory
执行结果:
TASK [是否为目录] ***********************************************************************************************************
ok: [192.168.108.22] => {}
MSG:
文件存在
TASK [是否为文件] *****************************************************************************************************
ok: [192.168.108.22] => {}
TASK [是否为目录] *****************************************************************************************************
ok: [192.168.108.22] => {}
PLAY RECAP **********************************************************************************************************
192.168.108.22 : ok=3 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这里测试的结果:
发现文件是否存在的情况,测试结果为测试执行的是本地机器的文件是否存在,并不是远程机器;
5、变量是否定义
define、undefined、none 来进行变量是否定义未定义,定义的情况值是否为空;
测试脚本:
---
- hosts: hostA
tasks:
- name: "变量定义、未定义测试"
vars:
name: zhangsan
debug:
msg: "name变量被定义,age未被定义"
when: name is defined and age is undefined
tags: define_var
- name: ""
vars:
name: ""
debug:
msg: "name的值为none"
when: name is none
tags: define_var
执行结果:
root@master:/home/user1# ansible-playbook -i ansible_host test_when.yml -t define_var
PLAY [hostA] *********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.108.22]
TASK [变量定义、未定义测试] ******************************************************************************************
ok: [192.168.108.22] => {}
MSG:
name变量被定义,age未被定义
TASK [变量定义的值为空] **********************************************************************************************
ok: [192.168.108.22] => {}
MSG:
name的值为none
PLAY RECAP ***********************************************************************************************************
192.168.108.22 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
6、通过任务的返回信息判断任务的执行状态success,failed,changed,skiped;
即:任务执行后的返回信息分别为success、failed、changed、skiped 的时候返回真;
如:test_when.yml
---
- hosts: hostA
tasks:
- name: "做准备工作"
command: uptime
register: result
tags: execute_result
- name: "success任务执行状态成功返回真"
tags: execute_result
debug:
msg: "任务执行状态为success,执行了此task"
when: result is success
- name: "failed任务执行状态失败返回真"
tags: execute_result
debug:
msg: "failed 任务执行结果为failed,实际结果为: {{result}}"
when: result is not failed
- name: "任务执行状态为change 返回真"
tags: execute_result
debug:
msg: "任务执行状态为changed,全部值为:{{result}}"
when: result is changed
- name: "任务执行状态为skip返回真"
tags: execute_result,skip
debug:
msg: "任务执行状态为skip,添加了skip 标签来进行测试"
when: result is skip