date: 2020-03-15title: ansible笔记:handlers的用法 #标题
tags: ansible——handlers #标签
categories: ansible # 分类
参考博文:Linux运维日志
handlers在ansible中是充当一个触发器的角色,当某个task任务执行成功后,它就自动触发handlers所对应的任务。
handlers和meta使用方法
这里只是写下了自己一个笔记,若想要参考更详细的,建议阅读我参考的博文。
---
- hosts: test70
remote_user: root
tasks:
- name: task1
file: path=/testdir/testfile
state=touch
notify: handler1 # 当task1任务执行成功时,触发handler1定义的任务
- name: task2
file: path=/testdir/testfile2
state=touch
notify: handler2 # 当task2任务执行成功时,触发handler2定义的任务
- meta: flush_handlers # 稍后解释meta
- name: task3
file: path=/testdir/testfile3
state=touch
notify: handler3 # 当task3任务执行成功时,触发handler3定义的任务
handlers: # 定义handlers任务
- name: handler1 # 此处的name值和上面notify指定的相对应,才能触发到相应的handlers
file: path=/testdir/ht1
state=touch
- name: handler2
file: path=/testdir/ht2
state=touch
- name: handler3
file: path=/testdir/ht3
state=touch
这里说一下上面代码中的meta,默认情况下,在playbook中所有的task执行完成,才会去执行触发的handlers任务,但是有些情况下,我们需要在某个task执行成功后,就必须马上去执行handlers任务,然后再往后接着执行task,so…..meta就出现了。meta就是这个作用。
一次触发多个handlers
我们可以在一个task中一次性notify多个handler,你可能会尝试将多个handler使用相同的name,但是这样并不可行,因为当多个handler的name相同时,只有一个handler会被执行,所以,我们并不能通过这种方式notify多个handler,如果想要一次notify多个handler,则需要借助另一个关键字,它就是’listen’,你可以把listen理解成”组名”,我们可以把多个handler分成”组”,当我们需要一次性notify多个handler时,只要将多个handler分为”一组”,使用相同的”组名”即可,当notify对应的值为”组名”时,”组”内的所有handler都会被notify,如下:
---
- hosts: test70
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。