# vim nginx.conf
---
 - hosts: web1
   gather_facts: no   #不收集被控端信息
   tasks:
   - name: install nginx
     yum:
       name: nginx
       state: present
     tags: test1

   - name: start nginx
     service:
       name: nginx
       state: started
     tags: test2,always

   - name: copy nginx.conf
     template:
       src: /tmp/nginx.conf
       dest: /etc/nginx/nginx.conf
     notify: restart nginx

   - name: meta test
     meta: flush_handlers        #强制执行

   - debug:
       msg: "always"
     tags: always

   - debug:
       msg: "never"
     tags: never

   handlers:
   - name: restart nginx
     service:
       name: nginx
       state: restarted

一、tags概念

        每次改完配置文件,没必要把整个playbook都运行一遍,只需要运行改变了的task。我们可以给task一个标签,运行playbook时明确只运行这个标签对应的task就可以了,
多个任务可以使用同一个tags。第一次运行playbook时我们期望所有的tasks都运行,第二次运行时我们期望只运行某一个task,你可以给这个task定义一个tags

只运行特定的tags标签:
ansible-playbook nginx.yaml --tags=test1

不运行指定的tags标签:
ansible-playbook nginx.yaml  --skip-tags=test1

ansible内置tag

  • always:一旦某个task被打上了always的tag,则无论是playbook的完整执行,还是指定tag执行,不管你指定的tag是啥,该任务总是会被执行。除非明确指定"--skip-tags=always"选项,才不会执行该task。

  • never:该标签与always正好相反,总是不会执行,除非明确指定"--tags=never"选项,才不会执行该task。。

  • tagged:运行playbook时,指定标签tagged,会运行所有带标签的任务      ansible-playbook nginx.yaml --tags tagged

  • untagged:运行playbook时,指定标签untagged,会运行所有不带标签的任务    ansible-playbook nginx.yaml --tags untagged 

 

二、handlers概念

handlers元素

        handlers 是一个触发器,也可以理解成是一个特殊的 tasks,与tasks同级,因为他无法直接运行,handlers中的任务会被tasks中的任务进行“调用”,但是,被调用,并不意味着一定会执行,只有当tasks中的任务真正执行以后(真正的操作,发生了改变),handlers中被调用的任务才会执行,如果tasks中的任务并没有做出任何实际的操作,那么handlers即使被调用,也不会执行。

notify元素

        notify元素作为handlers的触发器,在tasks中的某段代码中定义,与模块并列

注意:
1、无论多少个tasks通知了相同的handlers,handlers仅会在所有tasks结束后运行一次,除非调用meta 模块,立即执行的意思
2、只有tasks发生改变了才会通知handlers,没有改变则不会触发handlers
3、不能使用handlers替代tasks,因为handlers是一个特殊的tasks。
4、handler执行的顺序与handler在playbook中定义的顺序是相同的,与”handler被notify”的顺序无关
5、handlers中的- name的名字需要与notify定义的名字一致

 

强制执行失败的任务对应的处理程序force_handlers

如果在主机上的执行的任务失败时,则此任务对应的处理程序不再运行

此时可以通过force_handlers: yes实现,即使notify对应的响应任务执行失败,仍继续执行noftify对应的处理程序(即使任务失败了也要调用notify触发handlers)

force_handlers与tasks同层级

---
- hosts: web1
   force_handlers: yes
   tasks:

三、meta模块

默认情况下,task执行完毕之后,才会执行各个handlers,并不是执行完某个task之后,立即执行handlers,如果想要在某个场景中,执行完task,就立即执行handlers,就需要使用meta模块。

  - name: meta test
    meta: flush_handlers        #强制执行

当目标发生改变时直接执行handlers,不会等全部的tasks执行完才执行handlers:
# ansible-playbook nginx.yaml