date: 2020-03-15title: ansible笔记:handlers的用法 #标题
tags: ansible——handlers #标签
categories: ansible # 分类

参考博文:Linux运维日志
handlers在ansible中是充当一个触发器的角色,当某个task任务执行成功后,它就自动触发handlers所对应的任务。

handlers和meta使用方法

这里只是写下了自己一个笔记,若想要参考更详细的,建议阅读我参考的博文。

  1. ---
  2. - hosts: test70
  3. remote_user: root
  4. tasks:
  5. - name: task1
  6. file: path=/testdir/testfile
  7. state=touch
  8. notify: handler1 # 当task1任务执行成功时,触发handler1定义的任务
  9. - name: task2
  10. file: path=/testdir/testfile2
  11. state=touch
  12. notify: handler2 # 当task2任务执行成功时,触发handler2定义的任务
  13. - meta: flush_handlers # 稍后解释meta
  14. - name: task3
  15. file: path=/testdir/testfile3
  16. state=touch
  17. notify: handler3 # 当task3任务执行成功时,触发handler3定义的任务
  18. handlers: # 定义handlers任务
  19. - name: handler1 # 此处的name值和上面notify指定的相对应,才能触发到相应的handlers
  20. file: path=/testdir/ht1
  21. state=touch
  22. - name: handler2
  23. file: path=/testdir/ht2
  24. state=touch
  25. - name: handler3
  26. file: path=/testdir/ht3
  27. 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,如下:

  1. ---
  2. - hosts: test70
  3. remote_user: root
  4. tasks:
  5. - name: task1
  6. file: path=/testdir/testfile
  7. state=touch
  8. notify: handler group1
  9. handlers:
  10. - name: handler1
  11. listen: handler group1
  12. file: path=/testdir/ht1
  13. state=touch
  14. - name: handler2
  15. listen: handler group1
  16. file: path=/testdir/ht2
  17. state=touch

如上所示,handler1与handler2的listen的值都是handler group1,当task1中notify的值为handler group1时,handler1与handler2都会被notify。