Ansible(十八)-- ansible playbook中任务控制(三)--handlers及force_handelers

一、 handelers的作用

你可以把handlers理解成另一种tasks,handlers是另一种’任务列表’,handlers中的任务会被tasks中的任务进行”调用”,但是,被”调用”并不意味着一定会执行,只有当tasks中的任务”真正执行”以后(真正的进行实际操作,造成了实际的改变),handlers中被调用的任务才会执行,如果tasks中的任务并没有做出任何实际的操作,那么handlers中的任务即使被’调用’,也并不会执行。这样说似乎不容易被理解,我们来写一个小示例,示例如下。

[root@server4 ~]# vim handlers_test.yml

---
- hosts: testB
  remote_user: root
  tasks:
  - name: Modify the configuration
    lineinfile:
      path=/etc/httpd/conf/httpd.conf
      regexp="Listen 80"
      line="Listen 8088"
      backrefs=yes
      backup=yes
    notify:
      restart nginx

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

如上例所示,我们使用handlers关键字,指明哪些任务可以被’调用’,之前说过,handlers是另一种任务列表,你可以把handlers理解成另外一种tasks,你可以理解成它们是’平级’的,所以,handlers与tasks是’对齐’的(缩进相同),上例中的handlers中只有一个任务,这个任务的名称为”restart httpd”,之前也说明过,handlers中的任务需要被tasks中的任务调用,那么上例中,”restart httpd”被哪个任务调用了呢?很明显,”restart httpd”被”Modify the configuration”调用了,没错,如你所见,我们使用notify关键字’调用’handlers中的任务,或者说,通过notify关键字’通知’handlers中的任务,所以,综上所述,上例中的play表示,如果”Modify the configuration”真正的修改了配置文件(实际的操作),那么则执行”restart httpd”任务,如果”Modify the configuration”并没有进行任何实际的改动,则不执行”restart httpd” ,这就是handlers的作用。

二、handlers中的多任务实现

handlers是另一种任务列表,所以handlers中可以有多个任务,被tasks中不同的任务notify,示例如下

[root@server4 ~]# vim mkdir.yml


---
- hosts: testB
  remote_user: root
  tasks:
  - name: make testfile1
    file: path=/testdir/testfile1
          state=directory
    notify: ht2
  - name: make testfile2
    file: path=/testdir/testfile2
          state=directory
    notify: ht1

  handlers:
  - name: ht1
    file: path=/testdir/ht1
          state=touch
  - name: ht2
    file: path=/testdir/ht2
          state=touch

在这里插入图片描述

从上图可以看出,handler执行的顺序与handler在playbook中定义的顺序是相同的,与”handler被notify”的顺序无关。

四、meta模块

如上图所示,默认情况下,所有task执行完毕后,才会执行各个handler,并不是执行完某个task后,立即执行对应的handler,如果你想要在执行完某些task以后立即执行对应的handler,则需要使用meta模块,示例如下

[root@server4 ~]# vim mkdir2.yml 
[root@server4 ~]# cat mkdir2.yml 
---
- hosts: testB
  remote_user: root
  tasks:
  - name: task1
    file: path=/testdir/testfile
          state=touch
    notify: handler1
  - name: task2
    file: path=/testdir/testfile2
          state=touch
    notify: handler2

  - meta: flush_handlers

  - name: task3
    file: path=/testdir/testfile3
          state=touch
    notify: handler3

  handlers:
  - name: handler1
    file: path=/testdir/ht1
          state=touch
  - name: handler2
    file: path=/testdir/ht2
          state=touch
  - name: handler3
    file: path=/testdir/ht3
          state=touch

如上例所示,我在task1与task2之后写入了一个任务,我并没有为这个任务指定name属性,这个任务使用meta模块,meta任务是一种特殊的任务,meta任务可以影响ansible的内部运行方式,上例中,**meta任务的参数值为flush_handlers,”meta: flush_handlers”表示立即执行之前的task所对应handler,**什么意思呢?意思就是,在当前meta任务之前,一共有两个任务,task1与task2,它们都有对应的handler,当执行完task1与task2以后,立即执行对应的handler,而不是像默认情况那样在所有任务都执行完毕以后才能执行各个handler,那么我们来实际运行一下上述剧本,运行结果如下
在这里插入图片描述
正如上图所示,meta任务之前的任务task1与task2在进行了实际操作以后,立即运行了对应的handler1与handler2,然后才运行了task3,在所有task都运行完毕后,又逐个将剩余的handler根据情况进行调用。

如果想要每个task在实际操作后都立马执行对应handlers,则可以在每个任务之后都添加一个meta任务,并将其值设置为flush_handlers。 所以,我们可以依靠meta任务,让handler的使用变得更加灵活。

五、一个task中调用多个handler

我们还可以在一个task中一次性notify多个handler,怎样才能一次性notify多个handler呢?你可能会尝试将多个handler使用相同的name,但是这样并不可行,因为当多个handler的name相同时,只有一个handler会被执行,所以,我们并不能通过这种方式notify多个handler,如果想要一次notify多个handler,则需要借助另一个关键字,它就是’listen’,你可以把listen理解成”组名”,我们可以把多个handler分成”组”,当我们需要一次性notify多个handler时,只要将多个handler分为”一组”,使用相同的”组名”即可,当notify对应的值为”组名”时,”组”内的所有handler都会被notify,这样说可能还是不容易理解,我们来看个小示例,示例如下

[root@server4 ~]# vim mkdir3.yml 
[root@server4 ~]# cat mkdir3.yml 
---
- hosts: testB
  remote_user: root
  tasks:
  - name: task1
    file: path=/testdir/testfile
          state=touch
    notify: handler group1

  handlers:
  - name: handler1
    listen: handler group1
    file: path=/testdir/ht1
          state=touch
  - name: handler2
    listen: handler group1
    file: path=/testdir/ht2
          state=touch

在这里插入图片描述
如上例所示,handler1与handler2的listen的值都是handler group1,当task1中notify的值为handler group1时,handler1与handler2都会被notify,还是很方便的。

六、force_handelers强制执行handlers

通常任务失败会终止,force_handelers可以在任务失败后任然执行处理程序,注意要写在剧本中

---
- hosts
  force_handelers: yes
  tasks: 
    .........................
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值