金鱼哥说Ansible:第五章 实施任务控制---多条件判断

举报
金鱼哥 发表于 2022/04/12 09:55:24 2022/04/12
【摘要】 这样动手玩Ansible多条件判断真爽

这样动手玩Ansible多条件判断真爽

IT民工金鱼哥希望能以通俗易懂、诙谐幽默的方式把Ansible体系文章呈现给大家,让枯燥的知识点、让繁重的学习变的有趣一些。

前文已经介绍如何玩转Ansible条件任务而不踩坑,本章节就升级一点来玩,演示如何使用多条件判断,后续再来个循环语句和多条件判断来装逼。
image-20211215142642612

多条件判断

一个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的关键目标。
image-20211215142956971

通过使用括号分组条件,可以表达更复杂的条件语句。

---
- 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 $? 吗)

image-20211215143052857

[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语句的语法编写。

以上就是【金鱼哥】对 第五章 实施任务控制—多条件判断 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

111

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。