1、捕获一个命令的输出,根据命令的输出结果的不同来触发不同的task;
2、根据不同目标主机的facts,以定义不同的task;
3、可以直接调用变量,不需要加{{}};
一、比较运算符
== : 比较两个对象是否相等,相等则返回真。可用于比较字符串和数字,两个变量也可以比较。
!= : 比较两个对象是否不等,不等则为真。
> : 比较两个对象的大小,左边的值大于右边的值,则为真。
< : 比较两个对象的大小,左边的值小于右边的值,则为真。
>= :比较两个对象的大小,左边的值大于等于右边的值,则为真。
<= :比较两个对象的大小,左边的值小于等于右边的值,则为真。
举例1:
# vim /tmp/when1.yaml
---
- hosts: web3
tasks:
- name: copy file
copy:
content: when.txt
dest: /opt/when.txt
when: ansible_hostname == "ansible2"
举例2:
# vim /tmp/when2.yaml
---
- hosts: web1
remote_user: root
tasks:
- name: when test
shell: echo {{ item }} >> /tmp/a.txt
# debug:
# msg: var is {{ item }}
loop: [0,2,4,6,8]
when: item >= 4
二、逻辑运算符
在Ansible中,除了比较运算符,还支持逻辑运算符:
- and:逻辑与,当左边和右边两个表达式同时为真,则返回真
- or:逻辑或,当左右和右边两个表达式任意一个为真,则返回真
- not:逻辑否,对表达式取反
- ():当一组表达式组合在一起,形成一个更大的表达式,组合内的所有表达式都是逻辑与的关系
# 逻辑或
when: ansible_distribution == "RedHat" or ansible_distribution == "Fedora"
# 逻辑与
when: ansible_distribution_version == "7.9" and ansible_kernel == "3.10.0-1160.108.1.el7.x86_64"
when:
- ansible_distribution_version == "7.9"
- ansible_kernel == "3.10.0-1160.108.1.el7.x86_64"
# 组合
when:
( ansible_distribution == "RedHat" and ansible_distribution_major_version == "7" )
or
( ansible_distribution == "Fedora" and ansible_distribution_major_version == "28")
三、条件判断与tests
在shell当中,我们可使用test命令来进行一些常用的判断操作,如下:
# 判断/test文件是否存在
test -e /test
# 判断/testdir是否存在且为一个目录
test -d /testdir
事实上,在ansible中也有类似的用法,只不过ansible没有使用linux的test命令,而是jinja2模板的tests
1、判断路径
注意:这里的判断路径是否存在是判断主控节点的路径,与被控节点无关
- is exists 判断指定路径是否存在,存在则为真
- is not exists 判断指定路径是否存在,不存在则为真
# vim /tmp/when.yaml
---
- hosts: web1
vars:
- testfile1: /etc
- testfile2: /hello
tasks:
- name: 判断路径是否存在
debug:
msg: "{{ testfile1 }} 路径存在"
when: testfile1 is exists
- name: 判断路径是否存在
debug:
msg: "{{ testfile2 }} 路径不存在"
when: testfile2 is not exists
# when: not testfile2 is exists
2、判断变量
注意:这里的判断变量,与被控节点无关
- defined:判断变量是否已定义,已定义则返回真
- undefined:判断变量是否未定义,未定义则返回真
- none:判断变量的值是否为空,如果变量已定义且值为空,则返回真
举例:判断是否定义变量
# vim /tmp/when.yaml
---
- hosts: web1
vars:
- testvars1: test1
- testvars2:
tasks:
- name:
debug:
msg: "变量testvars1 is defined"
when: testvars1 is defined
- name:
debug:
msg: "变量testvars3 is undefined"
when: testvars3 is undefined
- name:
debug:
msg: "变量testvars2 is none"
when: testvars2 is none
3、判断执行结果
- sucess或succeeded:通过任务执行结果返回的信息判断任务的执行状态,任务执行成功则返回true
- failure或failed:任务执行失败则返回true
- change或changed:任务执行状态为changed则返回true
- skip或skipped:任务被跳过则返回true
# vim when.yaml
---
- hosts: test
gather_facts: no
vars:
doshell: true
tasks:
- shell: 'cat /testdir/aaa'
when: doshell
register: result
ignore_errors: true
- debug:
msg: "success"
when: result is success
- debug:
msg: "failed"
when: result is failure
- debug:
msg: "changed"
when: result is change
- debug:
msg: "skip"
when: result is skip
4、 判断路径
特别注意:关于路径的所有判断均是判断主控端上的路径,而非被控端上的路径
- file:判断指定路径是否为一个文件,是则为真
- directory:判断指定路径是否为一个目录,是则为真
- link:判断指定路径是否为一个软链接,是则为真
- mount:判断指定路径是否为一个挂载点,是则为真
- exists:判断指定路径是否存在,存在则为真
举例:
# vim /tmp/when.yaml
---
- hosts: web1
vars:
path1: "/etc/nginx/nginx.conf"
path2: "/tmp"
path3: "/root/a.txt.link"
path4: "/boot"
path5: "/test"
tasks:
- name: 判断指定路径是否为文件
debug:
msg: 'this path1 is file'
when: path1 is file
- name: 判断指定路径是否为目录
debug:
msg: 'this path2 is directory'
when: path2 is directory
- name: 判断指定路径是否为软链接
debug:
msg: 'this path3 is link’
when: path3 is link
- name: 判断指定路径是否为挂载点
debug:
msg: 'this path4 is mount'
when: path4 is mount
- name: 判断指定路径存在
debug:
msg: 'this path2 is exists'
when: path2 is exists
- name: 判断指定路径不存在
debug:
msg: 'this path5 is not exists'
when: path5 is not exists
# when: not path5 is exists
判断被控端文件是否存在或者是否为软链接或者其他状态,使用stat模块
判断文件是否存在 exists
判断是否为软链接 islnk
在被控端创建软链接
# ansible web1 -m file -a "path=/root/a.txt state=touch"
# ansible web1 -m file -a "src=/root/a.txt dest=/root/a.txt.link state=link"
# vim when.yaml
---
- hosts: web1
vars:
path3: "/root/a.txt.link"
tasks:
- name: 获取文件信息
stat:
path: "{{ path3 }}"
register: aa_link
- name: 判断指定路径是否为软链接
debug:
msg: 'this path3 is link'
when: aa_link.stat.islnk