zoukankan      html  css  js  c++  java
  • Ansible系列基础篇 1.7.2、PlayBook之handlers

    Handlers介绍:

     handlers本质上是一个task,可执行task任务。handlers用来解决触发任务的,也就是当一个tasks真正的执行后,结果发生了变化(changed=1),会去触发handlers里的task。(handlers配合notify使用。)一个handler最多只执行一次,并且在所有的任务都执行完成之后再执行;如果有多个任务调用同一个handler,那么也只执行一次,这个也是同普通的Event机制的一个不同点。handler是按照handlers里定义的顺序执行的,而不是按照在任务中的调用顺序执行的。

     普通示例:

    ---
    # 修改nignx配置文件,修改成果,则重启nginx
    - hosts: test70
      remote_user: root
      tasks:
      - name: Modify the configuration
        lineinfile:
          path=/etc/nginx/conf.d/test.nginx.conf
          regexp="listen(.*) 8080(.*)"
          line="listen1 80882"
          backrefs=yes
          backup=yes
        notify:
          restart nginx
     
      handlers:
      - name: restart nginx
        service:
          name=nginx
          state=restarted
    ...
    

      

     多个tasks调用多个handlers里的任务:

    ---
    - hosts: all
      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"的顺序无关。

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

    ---
    - hosts: test70
      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
    ...
    

    执行结果:

    正如上图所示,meta任务之前的任务task1与task2在进行了实际操作以后,立即运行了对应的handler1与handler2,然后才运行了task3,在所有task都运行完毕后,又逐个将剩余的handler根据情况进行调用。

    notify多个handlers任务(使用listen语法),如下两种方式:

    ---
    - 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
    ...
    
    ---
    - hosts: test70
      remote_user: root
      tasks:
      - name: task1
        file: path=/testdir/testfile
              state=touch
        notify: 
          - handler1
    	  - handler2
     
      handlers:
      - name: handler1
        file: path=/testdir/ht1
              state=touch
      - name: handler2
        file: path=/testdir/ht2
              state=touch
    ...
    

      

  • 相关阅读:
    git
    代理上网时git不能直接连接远程库的解决办法
    Python程序练习2--模拟三级菜单
    python os模块常用文件操作方法
    Python程序练习1-模拟用户登录验证
    牛牛牛图片胡乱下载
    oozie 4.1.0与4.2.0版本问题BUG
    hbase 协处理器,实现group by,distinct函数
    Js公共操作类 之 String 扩展方法介绍(一)
    CSS3之伪元素选择器和伪类选择器
  • 原文地址:https://www.cnblogs.com/wangsl1204/p/14181799.html
Copyright © 2011-2022 走看看