目录
一、判断语句when。
when作为一个判断语句,出现在某个 task下,格式如下。
asks:
‐ name: aa
模块1
when: 条件1
- 如果条件1成立,则执行模块1,否则不执行。
注意:在when中引用变量时是不用加{{}}的
[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是可以混用的,为了看得更清晰,可以使用小括号。
[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
练习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的用法
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 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被定义了,则显示111,这里aa被定义了,所以判断成立,会执行task1。
- 如果bb没有被定义,则显示222,这里bb被定义了,所以判断不成立,不会执行task2。
-
如果cc没有被定义,则显示333,这里cc没有被定义,所以判断成立,会执行task3
[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