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
分类:
运维 / ansible
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)