# 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