Ansible自动化运维之Playbook条件判断

在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条件判断

精彩评论

6+4=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏