第三十二章 控制语句

本文详细介绍了Ansibleplaybook中when判断语句的使用,包括比较运算符(如><、!=)的应用、in和is关键字的用法,以及如何在任务执行中设置条件。通过实例演示了如何利用when控制任务的执行情况。
摘要由CSDN通过智能技术生成
        一个play中可以包含多个task,如果不想所有的task全部执行,可以设置只有满足某个条件才执行这个task,不满足条件则不执行此task。本章主要讲解when 和 block-rescue两种判断语句。

一、判断语句when。

when作为一个判断语句,出现在某个 task下,格式如下。

asks:
‐ name: aa
模块1
when: 条件1
  • 如果条件1成立,则执行模块1,否则不执行。

注意:在when中引用变量时是不用加{{}}的

      本章实验都在/home/duan/demo3下操作,先把 demo3目录创建出来并把ansible.cfg和 hosts拷贝进去,命令如下。
[bdqn@rhel8_70 ~]$ mkdir demo3
[bdqn@rhel8_70 ~]$ cp ansible.cfg hosts demo3/
[bdqn@rhel8_70 ~]$ cd demo3/

1.when判断中>、<、!=的使用

练习1:

(1)写一个playbook,判断某条件是否成立,成立了才执行task,否则不执行,命令如下。

[bdqn@rhel8_70 demo3]$ vim when-1.yaml

---
- hosts: server2
  tasks:
    - name: task1
      debug: msg="111"
      when: 1<2

(2)这里有一个task,判断1<2是否成立,如果成立则执行task1,屏幕上会显示111;如果不成立则不执行taskl,屏幕上不会显示111。这里明显是成立的,所以会执行task1。运行结果如下。

[bdqn@rhel8_70 demo3]$ ansible-playbook when-1.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task1] **************************************************************************************
ok: [server2] => {
    "msg": "111"
}

PLAY RECAP ****************************************************************************************
server2                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • when后面可以有多个条件,用or或and作为连接符。
  • 如果用or作为连接符,只要有一个条件成立即可,只有所有的条件都不成立时,整体才不成立。
练习2:

(1)修改when-1.yaml的内容如下。

[bdqn@rhel8_70 demo3]$ vim when-1.yaml 

---
- hosts: server2
  tasks:
    - name: task1
      debug: msg="111"
      when: 1 < 2 or 2 > 3

(2)此处用or作为连接符,只要有一个条件成立就会成立,2>3不成立,但是1<2成立,所以整体上就是成立的。运行结果如下。

[bdqn@rhel8_70 demo3]$ ansible-playbook when-1.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task1] **************************************************************************************
ok: [server2] => {
    "msg": "111"
}

PLAY RECAP ****************************************************************************************
server2                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 仍然会执行task1。
练习3:

(1)修改when-1.yaml的内容如下。

[bdqn@rhel8_70 demo3]$ vim when-1.yaml

---
- hosts: server2
  tasks:
    - name: task1
      debug: msg="111"
      when: 1 > 2 or 2 > 3

(2)此处用or作为连接符,1>2不成立且2>3也不成立,所以整体上就是不成立的,不会执行task1。运行结果如下。

[bdqn@rhel8_70 demo3]$ ansible-playbook when-1.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task1] **************************************************************************************
skipping: [server2]

PLAY RECAP ****************************************************************************************
server2                    : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0 
  • 也可以用and作为连接符,如果用and作为连接符,需要所有条件全部成立,只要有一个条件不成立,整体上就是不成立的。

练习4:

(1)修改when-1.yaml的内容如下。

[bdqn@rhel8_70 demo3]$ vim when-1.yaml 

---
- hosts: server2
  tasks:
    - name: task1
      debug: msg="111"
      when: 1 > 2 and 2 > 3

(2)这里虽然2>1是成立的,但是2>3不成立,所以整体上就是不成立的,因为用and作为连接符,需要所有的条件都成立才可以,所以不会执行task1。运行结果如下。

[bdqn@rhel8_70 demo3]$ ansible-playbook when-1.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task1] **************************************************************************************
skipping: [server2]

PLAY RECAP ****************************************************************************************
server2                    : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
练习5:
  • 在判断中,or 和 and是可以混用的,为了看得更清晰,可以使用小括号。
(1)修改 when-1.yaml 的内容如下。
[bdqn@rhel8_70 demo3]$ vim when-1.yaml

---
- hosts: server2
  tasks:
    - name: task1
      debug: msg="111"
      when: (1>2 or 2!=1) and 2 > 3

(2)这里(1>2 or 2!=1)作为一个整体,1>2不成立,但是2!=1(=是不等于的意思)成立,所以此处( 1>2 or 2!=1)作为一个整体是成立的。and后面2>3不成立,所以整个when后面的判断是不成立的,不会执行此 task1。运行结果如下。

[bdqn@rhel8_70 demo3]$ ansible-playbook when-1.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task1] **************************************************************************************
skipping: [server2]

PLAY RECAP ****************************************************************************************
server2                    : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

常见的判断符包括以下6种:

  • ==:等于
  • !=:不等于
  • >:大于
  • >=:大于等于
  • <:小于
  • <=:小于等于
练习6:

(1)如果server2的系统主版本是7(RHEL/CentOS7),则打印111,否则不打印。playbook的内容如下。

[bdqn@rhel8_70 demo3]$ vim when-2.yaml

---
- hosts: server2
  tasks:
    - name: task2
      debug: msg="111"
      when: ansible_distribution_major_version == "7"

(2)因为server2的系统是RHEL8,所以不会执行此task2,就不会显示111。

[bdqn@rhel8_70 demo3]$ ansible-playbook when-2.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task2] **************************************************************************************
skipping: [server2]

PLAY RECAP ****************************************************************************************
server2                    : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
注意 ansible_distribution major version的值是一个字符串,所以when判断中=后面的7是要加引号 的。
练习7:

(1)修改when-2.yaml的内容如下。

[bdqn@rhel8_70 demo3]$ vim when-2.yaml 

---
- hosts: server2
  tasks:
    - name: task2
      debug: msg="111"
      when: ansible_distribution_major_version == "8"

(2)再次运行此playbook,命令如下,会显示111。

[bdqn@rhel8_70 demo3]$ ansible-playbook when-2.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task2] **************************************************************************************
ok: [server2] => {
    "msg": "111"
}

PLAY RECAP ****************************************************************************************
server2                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
  • 再次提醒:在when 中引用变量时是不用加{{}}的。

2.when判断中in的用法

在when语句中,除可以使用上面的大于、小于等判断方法外,还可以使用 in,用法如下。
value in 列表
  • 如果此值在这个列表中,则判断成立,否则不成立。
练习:

(1)判断某值是否在列表中,编写 when-3.yaml,命令如下。

[bdqn@rhel8_70 demo3]$ vim when-3.yaml
---
- hosts: server2
  vars:
    list1: [1,2,3,4]
  tasks:
    - name: task3
      debug: msg="333"
      when: 2 in list1

(2)此处定义了一个列表 list1,里面有4个值,分别为1、2、3、4;定义了一个task打印333,会不会执行这个task,就要看when后面的判断是否成立。如果2在列表list1中,则执行;如果不在,则不执行,很明显2在列表list1中,所以会执行此task,即屏幕上会显示333。运行结果如下。

[bdqn@rhel8_70 demo3]$ ansible-playbook when-3.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task3] **************************************************************************************
ok: [server2] => {
    "msg": "333"
}

PLAY RECAP ****************************************************************************************
server2                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

(3)因为2在列表list1中,when判断成立,可以正确执行task3,所以屏幕上会显示333。修改when-3.yaml的内容如下。

[bdqn@rhel8_70 demo3]$ vim when-3.yaml

---
- hosts: server2
  vars:
    list1: [1,2,3,4]
  tasks:
    - name: task3
      debug: msg="333"
      when: 2 not in list1

(4)这里判断的是2不在列表list1中,但2是在列表list1中的,所以判断不成立。运行结果如下。

[bdqn@rhel8_70 demo3]$ ansible-playbook when-3.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task3] **************************************************************************************
skipping: [server2]

PLAY RECAP ****************************************************************************************
server2                    : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0 

3.when判断中is的用法

is可以用于判断变量是否被定义,常见的判断包括以下3种。
  • is defined:变量被定义。
  • is undefined:等同于is not defined,变量没有被定义。
  • is none:变量被定义了,但是值为空。

看下面的例子。

[bdqn@rhel8_70 demo3]$ vim when-4.yaml

---
- hosts: server2
  vars:
    aa: 1
    bb:
  tasks:
    - name: task1
      debug: msg="111"
      when: aa is undefined
    - name: task2
      debug: msg="222"
      when: bb is undefined
    - name: task3
      debug: msg="333"
      when: cc is not defined
首先定义了两个变量:aa和 bb,其中bb的值为空,此处并没有定义cc。后面定义了以下3个task。
  • 如果aa被定义了,则显示111,这里aa被定义了,所以判断成立,会执行task1。
  • 如果bb没有被定义,则显示222,这里bb被定义了,所以判断不成立,不会执行task2。
  • 如果cc没有被定义,则显示333,这里cc没有被定义,所以判断成立,会执行task3
这里is undefined 和is not defined是一个意思。
查看运行的结果,如下所示。
[bdqn@rhel8_70 demo3]$ ansible-playbook when-4.yaml 

PLAY [server2] ************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [server2]

TASK [task1] **************************************************************************************
skipping: [server2]

TASK [task2] **************************************************************************************
skipping: [server2]

TASK [task3] **************************************************************************************
ok: [server2] => {
    "msg": "333"
}

PLAY RECAP ****************************************************************************************
server2                    : ok=2    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值