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