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

 

posted @ 2023-03-30 14:16  橘子飞飞  阅读(421)  评论(0编辑  收藏  举报