在ansible中,通过when关键字进行条件判断,判断方式有文件、变量、路径和执行结果等,然后根据结果决定相应的操作。
基本判断逻辑:
类型 | 说明 |
字符串 | 使用单引号或双引号 |
数字 | 整数,浮点数 |
列表 | [item1, item2, ...] |
元组 | (item1, item2, ...) |
字典 | {key1:value1, key2:value2, ...} |
布尔型 | true false |
算术运算 | + - * / // % ** |
比较操作 | == != > >= < <= |
逻辑运算 | and or not |
流表达式 | for if when |
0x01 判断变量
结果 | 说明 |
defined | 判断变量是否已经定义,已定义返回真 |
undefined | 判断变量是否已经定义,未定义返回真 |
none | 判断变量是否已经定义且赋值,当变量的值为空时返回真 |
示例:
- hosts: webservice remote_user: root gather_facts: no vars: demovar: "demo" demovar1: tasks: - debug: msg: "已定义变量" when: demovar is defined - debug: msg: "已定义变量,但未赋值" when: demovar1 is none - debug: msg: "未定义变量" when: demovar2 is undefined
0x02 判断执行结果
通过任务的返回信息判断其执行状态:
结果 | 说明 |
success, succeeded | 成功则返回真 |
failure, failed | 失败则返回真 |
change, changed | 状态为changed则返回真 |
skip, skipped | 当不满足任务执行条件被跳过时返回真 |
示例:
- hosts: webservice remote_user: root gather_facts: no vars: getport: "yes" tasks: - shell: "/usr/bin/netstat -tlnp" when: getport == "yes" register: returnmsg ignore_errors: true - debug: msg: "已获取端口列表" when: returnmsg is success - debug: msg: "未获取端口列表" when: returnmsg is failure - debug: msg: "端口列表发生改变" when: returnmsg is change - debug: msg: "跳过获取端口操作" when: returnmsg is skip
0x03 判断文件目录
该模块貌似有问题,测试时全部返回“skipping”,ansible版本2.9.23。
结果 | 说明 |
file | 判断路径是否是一个文件,是则返回真 |
directory | 判断路径是否是一个目录,是则返回真 |
link | 判断路径是否是一个软连接,是则返回真 |
mount | 判断路径是否是一个挂载点,是则返回真 |
exists | 判断路径是否存在,存在则返回真 |
示例:
- hosts: webservice remote_user: root gather_facts: no vars: demopath1: "/demodir/demofile" demopath2: "/demodir/" demopath3: "/demodir/demosoftlink" demopath4: "/demodir/demohardlink" demopath5: "/data" tasks: - debug: msg: "这是一个文件" when: demopath1 is file - debug: msg: "这是一个目录" when: demopath2 is directory - debug: msg: "这是一个链接" when: demopath3 is link - debug: msg: "这是一个链接" when: demopath4 is link - debug: msg: "这是一个挂载目录" when: demopath5 is mount - debug: msg: "路径存在" when: demopath5 is exists
0x04 其他判断逻辑
结果 | 说明 |
version | 比较两个版本号的大小 |
subset | 判断一个list是不是另一个list的子集,是则返回真 |
siperset | 判断一个list是不是另一个list的父集,是则返回真 |
string | 判断对象是否为字符串,是则返回真 |
number | 判断对象是否为数字,是则返回真 |
示例:
- hosts: webservice remote_user: root gather_facts: no vars: demovar1: 1 demovar2: "1" demovar3: a tasks: - debug: msg: "这是一个字符串" when: demovar1 is string - debug: msg: "这是一个字符串" when: demovar2 is string - debug: msg: "这是一个字符串" when: demovar3 is string - debug: msg: "这是一个数字" when: demovar1 is number - debug: msg: "这是一个数字" when: demovar2 is number - debug: msg: "这是一个数字" when: demovar3 is number
更多示例
示例1·not取反:
- hosts: webservice remote_user: root tasks: - debug: msg: "操作系统不是Redhat" when: not ansible_distribution == "Redhat"
示例2·and多重:
# 方法1: - hosts: webservice remote_user: root tasks: - debug: msg: "操作系统是CentOS7" when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" # 方法2: - hosts: webservice remote_user: root tasks: - debug: msg: "操作系统是CentOS7" when: - ansible_distribution == "CentOS" - ansible_distribution_major_version == "7"
示例3·命令执行结果:
- hosts: webservice remote_user: root tasks: - name: task1 shell: "ls /demodir" register: returnmsg - name: task2 debug: msg: "命令执行成功" when: returnmsg.rc == 0 - name: task3 debug: msg: "命令执行失败" when: returnmsg.rc != 0
原创文章禁止转载:技术学堂 » Ansible自动化运维之Playbook条件判断