金鱼哥说Ansible:第五章 实施任务控制---多条件判断
这样动手玩Ansible多条件判断真爽
IT民工金鱼哥希望能以通俗易懂、诙谐幽默的方式把Ansible体系文章呈现给大家,让枯燥的知识点、让繁重的学习变的有趣一些。
前文已经介绍如何玩转Ansible条件任务而不踩坑,本章节就升级一点来玩,演示如何使用多条件判断,后续再来个循环语句和多条件判断来装逼。
多条件判断
一个when语句可用于评估多个条件。使用and和or关键字组合条件,并使用括号分组条件。
[student@servera ~]$ ansible -i hosts servera -m setup | grep bios_version
"ansible_bios_version": "0.5.1",
[student@servera ~]$ cat test.yml
---
- name: when test
hosts: servera
remote_user: root
tasks:
- name: httpd installed
yum:
name: httpd
state: present
when: ansible_facts['architecture'] == 'x86_64' and ansible_facts['bios_version'] == '0.5.1'
这里的条件语句表示:当受管主机ansible_facts下的ansible_architecture等于“x86_64”和ansible_bios_version等于“0.5.1”,这两个条件同时满足时,才会执行安装httpd的服务
执行测试:
[student@servera ~]$ ansible-playbook -i hosts test.yml
PLAY [when test] ************************************************************************
TASK [Gathering Facts] ******************************************************************
ok: [servera]
TASK [httpd installed] ******************************************************************
changed: [servera]
PLAY RECAP ******************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0
# 测试执行成功
如果有一个条件不符合:
[student@servera ~]$ cat test.yml
---
- name: when test
hosts: servera
remote_user: root
tasks:
- name: httpd installed
yum:
name: httpd
state: present
when: ansible_facts['architecture'] == 'x86_64' and ansible_facts['bios_version'] == '0.5.2'
# 这里将bios_version改为"0.5.2"
执行测试:
[student@servera ~]$ ansible-playbook -i hosts test.yml
PLAY [when test] ***********************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [servera]
TASK [httpd installed] *****************************************************************
skipping: [servera]
PLAY RECAP *****************************************************************************
servera : ok=1 changed=0 unreachable=0 failed=0
你会发现显示skipping,跳过这任务的执行。
上述playbook的另一种写法:
when关键字还支持使用列表来描述条件列表。向when关键字提供列表时,将使用and运算组合所有条件。
---
- name: when test
hosts: servera
remote_user: root
tasks:
- name: httpd installed
yum:
name: httpd
state: present
when:
- ansible_facts['architecture'] == 'x86_64'
- ansible_facts['bios_version'] == '0.5.1'
这种格式提高了可读性,而可读性是良好编写Ansible Playbook的关键目标。
通过使用括号分组条件,可以表达更复杂的条件语句。
---
- name: when test
hosts: servera
remote_user: root
tasks:
- name: httpd installed
yum:
name: httpd
state: present
when: >
ansible_facts['architecture'] == 'x86_64'
or
ansible_facts['bios_version'] == '0.5.1'
这种写法的条件语句只需要满足多个条件中的一个就满足了条件,就能执行安装任务。
(还记得when后的 > 符号吗?是代表后面的字符窜是同一行,还有 | 符号也是。基础的东西很重要,要谨记。)
将上述的几种方法配合使用:
---
- name: when test
hosts: servera
remote_user: root
tasks:
- name: httpd installed
yum:
name: httpd
state: present
when: >
( ansible_facts['architecture'] == "x86_64" and
ansible_facts['bios_version'] == "6.00" )
or
( ansible_facts['bios_version'] == "5.00" and
ansible_facts['architecture'] == "x86_32" )
括号内的条件必须两个同时满足,而括号外的两个条件整体两个满足一个即可满足条件语句要求。
循环语句和多条件判断语句
还可以与循环语句作为组合使用。
---
- name: when test
hosts: servera
remote_user: root
tasks:
- name: httpd installed
yum:
name: httpd
state: present
loop: "{{ ansible_facts['mounts'] }}"
when:
- item.mount == '/'
- item.size_available > 88420000
这里需要满足item.mount和item.size_available > 88420000这两个条件才能触发安装httpd的任务。
也许你会问,为什么要写成循环,因为ansible_facts[‘mounts’].mount 有2个值,所以要使用循环,我们可使用setup模块进行观察。
[student@servera ~]$ ansible localhost -m setup -a 'filter=*mounts*'
localhost | SUCCESS => {
"ansible_facts": {
"ansible_mounts": [
{
"block_available": 21105,
"block_size": 4096,
"block_total": 50345,
"block_used": 29240,
"device": "/dev/sda1",
"fstype": "xfs",
"inode_available": 102074,
"inode_total": 102400,
"inode_used": 326,
"mount": "/boot",
"options": "rw,relatime,attr2,inode64,noquota",
"size_available": 86446080,
"size_total": 206213120,
"uuid": "80184c5c-3a00-41c6-a458-f4db8148072e"
},
{
"block_available": 4306130,
"block_size": 4096,
"block_total": 4925952,
"block_used": 619822,
"device": "/dev/mapper/system-root",
"fstype": "xfs",
"inode_available": 9774997,
"inode_total": 9857024,
"inode_used": 82027,
"mount": "/",
"options": "rw,relatime,attr2,inode64,noquota",
"size_available": 17637908480,
"size_total": 20176699392,
"uuid": "2bdd417e-828b-4e8d-9578-db4bf5b42ee7"
}
]
},
"changed": false
}
组合使用注册变量和条件判断语句
我们还可以通过使用注册变量上的输出来作为条件上的判断。(啥?如果忘记了如何判断注册变量输出的值,可参考关于注册变量的那一章节,其实,我们直接运用debug模块就可知道了。)
- name: when test
hosts: servera
remote_user: root
tasks:
- name: httpd status
command: /usr/bin/systemctl is-active httpd #查看httpd服务状态
ignore_errors: yes #忽略报错,报错后直接跳过不终止任务
register: result #将以上任务的结果注册为变量
- name: httpd restarted
service:
name: httpd
state: restarted
when: result.rc == 3 #如果注册变量的返回值为3则执行重启httpd的任务
上述是编写任务先将httpd服务查看作为注册变量,然后将这注册变量值中的 rc 值作为条件判断,如果返回值为3,则重启服务。(因为systemctl is-active httpd命令如果服务没启动,返回值为3,还记得echo $? 吗)
[student@servera ~]$ ansible-playbook -i hosts test.yml
PLAY [when test] ***********************************************************************
TASK [Gathering Facts] ******************************************************************
ok: [servera]
TASK [httpd status] *********************************************************************
fatal: [servera]: FAILED! => {"changed": true, "cmd": ["/usr/bin/systemctl", "is-active", "httpd"], "delta": "0:00:00.004768", "end": "2020-09-08 16:44:17.090311", "msg": "non-zero return code", "rc": 3, "start": "2020-09-08 16:44:17.085543", "stderr": "", "stderr_lines": [], "stdout": "unknown", "stdout_lines": ["unknown"]}
...ignoring
TASK [httpd restarted] ******************************************************************
changed: [servera]
PLAY RECAP *****************************************************************************
servera : ok=3 changed=2 unreachable=0 failed=0
总结
- 使用 and 和 or 进行多条件判断的编写。
- 可使用括号进行多条件的组合编写。
- 循环语句可与多条件判断组合使用,注册变量和条件判断语句也可组合使用。
- 注意when语句的语法编写。
以上就是【金鱼哥】对 第五章 实施任务控制—多条件判断 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
- 点赞
- 收藏
- 关注作者
评论(0)