Ansible中的条件判断、handlers

1.有条件地运行任务

Ansible可使用conditionals在符合特定条件时执行任务或play。

所以我们可以利用条件来区分不同的受管主机,并根据它们所符合的条件来分配功能角色。Playbook变量、注册的变量和Ansible事实都可通过条件来进行测试。可以使用比较字符串、数字数据和布尔值的运算符。

以下场景说明了在Ansible中使用条件的几种情况:

1.可以在变量中定义硬限制(如min_memory)并将它与受管主机上的可用内存进行比较。
2.Ansible可以捕获并评估命令的输出,以确定某一任务在执行进一步操作前是否已经完成。例如,如果某一程序失败,则将路过批处理。
3.可以利用Ansible事实来确定受管主机网络配置,并决定要发送的模板文件(如,网络绑定或中继)。
4.可以评估CPU的数量,来确定如何正确调节某一Web服务器。
5.将注册的变量与预定义的变量进行比较,以确定服务是否已更改。例如,测试服务配置文件的MD5检验以和查看服务是否已更改。

2.条件任务语法

when语句用于有条件地运行任务。它取要测试的条件为值。如果条件满足,则运行任务。如果条件不满足,则跳过任务。

测试my_service变量是否具有值。

---
- hosts: all
  vars: 
    my_ser: httpd
  tasks:
    - name: "{{ my_ser }} package is install" 
      yum: 
        name: "{{ my_ser }}"
        state: present
      when: my_ser is defined

下表显示了在处理条件时可使用的一些运算:

操作示例
等于(值为字符串)ansible_machine == “x86_64”
等于(值为数字)max_memory == 512
小于min_memory < 128
大于min_memory > 256
小于等于min_memory <= 256
大于等于min_memory >= 512
变量存在min_memory is defined
变量不存在min_memory is not defined
布尔变量是True。1、True或yes的求值为Truememory_available
布尔变量是False。0、False或no的求值为Falsenot memory_available
第一个变量的值存在,作为第二个变量的列表中的值ansible_distribution in supported_distros

如果ansible_distribution的值在sup_dir列表中,则条件通过且任务运行。

---
- hosts: all
  vars:
    sup_dir:
      - RedHat
      - CentOS
  tasks:
    - name: asdad
      yum:
        name: httpd
        state: present
      when: ansible_facts['distribution'] in sup_dir


[root@ansible jay]# ansible-playbook playbook.yml 

PLAY [all] ***********************************************************************

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

TASK [asdad] *********************************************************************
changed: [192.168.10.129]

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

3.多个条件一起测试

一个when语句可用于评估多个条件。使用and和or关键字组合条件,并使用括号分组条件。

1.如果任一条件为真时满足条件语句,则应当使用or语句。

when: ansible_distribution == "Redhat" or ansible_distribution == "CentOS"

2.使用and运算时,两个条件都必须为真,才能满足整个条件语句。

when: ansible_distribution_version == "7.3" or ansible_distribution == "CentOS"

3.when关键字还支持使用列表来描述条件列表。向when关键字提供列表时,将使用and运算组合所有条件。

when:
  - ansible_distribution_version == "7.5"
  - ansible_distribution == "CentOS"

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

---
- hosts: all
  tasks:
    - name: asdad
      yum:
        name: httpd
        state: absent
      when: >
        ansible_distribution == "CentOS"
        or
        ansible_distribution_version == "7.5"

4.组合循环和有条件任务

循环和条件可以组合使用。

---
- hosts: all
  tasks:
    - name: asdad
      yum:
        name: httpd
        state: present
      loop: "{{ ansible_facts['mounts'] }}"
      when: 
        - item.mount == "/"
        - item.size_available > 30000000

5.ansible处理程序

Ansible模块设计为具有幂等性。这表示,在正确编写的playbook中,playbook及其任务可以运行多次而不会改变受管主机,除非需要进行更改使受管主机进入所需的状态。

但在时候,在任务确实更改系统时,可能需要运行进一步的任务。例如,更改服务配置文件时可能要求重新加载该服务以便使其更改的配置生效。处理程序是响应由其他任务触发的通知的任务。

---
- hosts: all
  tasks:
    - name: 2123
      yum:
        name: httpd
        state: present

    - name: 2131
      template:
        src: files/1
        dest: /etc/1
      notify:
        - restart apache

    - name: dad
      service:
        name: httpd
        state: started

  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted


[root@ansible jay]# ansible-playbook playbook.yml 

PLAY [all] ***********************************************************************

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

TASK [yum] ***********************************************************************
ok: [192.168.10.129]

TASK [template] ******************************************************************
changed: [192.168.10.129]

TASK [dad] ***********************************************************************
changed: [192.168.10.129]

RUNNING HANDLER [restart apache] *************************************************
changed: [192.168.10.129]

PLAY RECAP ***********************************************************************
192.168.10.129             : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值