ansible- handlers用法
-
清单配置:
cat /etc/ansible/hosts [test] 18.18.23.102 ansible_become_pass='123.cn'
-
配置文件配置:
cat /etc/ansible/ansible.cfg [defaults] inventory = /etc/ansible/hosts
-
handlers介绍和用法
handlers是另一种'任务列表',handlers中的任务会被tasks中的任务进行调用。当tasks中的任务真正执行后,handlers中被调用的任务才会执行。如果tasks中的任务并没有做出真正的操作,handlers中的任务即使被调用,也并不会被执行。handlers可以有多个任务,并被tasks中不同的任务notify.
handlers和tasks是对齐的。通过notify关键字通知handlers中的任务。
所有task执行完毕后,才会执行各个handler.
如果在执行完某些task以后立即执行对应的handler,需要使用meta模块。
meta任务是一种特殊任务,meta任务可影响ansible的内部运行方式。meta:flush_handlers表示立即执行之前的task所对应handler.
例如: cat meta.yaml
---
- hosts: test
remote_user: yuan
tasks:
- name: task1
file:
path: /php7/osspull
state: touch
notify: handler1
- name: task2
file:
path: /php7/ossupload
state: touch
notify: handler2
- meta: flush_handlers
- name: task3
file:
path: /python/smtposs
state: touch
notify: handler3
handlers:
- name: handler1
file:
path: /php7/video.txt
state: touch
- name: handler2
file:
path: /php7/video2.txt
state: touch
- name: handler3
file:
path: /python/smtpemail.txt
state: touch
在每个task执行后立马执行对应handlers,可以在每个任务后都添加一个meta任务,并将其值设置为flush_handlers.
如果一次notify多个handler,需要借助关键字: listen.
可将listen理解为组名。 一次notify多个handler时,把多个handler分为"一组",使用相同组名即可。
例如: cat listen.yaml
---
- hosts: test
remote_user: yuan
tasks:
- name: taskone
file:
path: /php7/wordpress.txt
state: touch
notify: handler group 1
handlers:
- name: handler1
listen: handler group 1
file:
path: /php7/wp1
state: touch
- name: handler2
listen: handler group 1
file:
path: /php7/wp2
state: touch
tags的用法
当你想要执行一个playbook脚本其中的一部分任务时,该怎么办呢?
这个时候tags就派上用场了。
tags可以对任务进行"打标签", 根据标签,我们可以指定哪些任务可以执行,哪些任务不执行。
例如:
cat tags.yaml
---
- hosts: test
remote_user: yuan
tasks:
- name: one
file:
path: /dockerfile/alpine-nginx
state: directory
tags: a1
- name: two
file:
path: /dockerfile/alpine-mysql
state: directory
tags: a2
- name: three
file:
path: /dockerfile/alpine-python
state: directory
tags: a3
只执行a2的任务:ansible-playbook -S -R root --tags=a2 tags.yaml
使用--tags选项指定某个标签,当指定标签后,标签对应的任务就会被执行,其他任务则不会被执行。
也可以使用--skip-tags选项指定"不执行的任务".
可以为每个任务添加多个标签。如果不同的多个任务之间有关联性,也可以使用相同的标签。
语法示例:
语法1:
tags:
- n1
- nginx
语法2:
tags: n1,nginx
调用标签时,可一次性指定多个标签,调用多个标签用逗号隔开。
查看tags.yaml中有哪些标签,执行:ansible-playbook -S -R root --list-tags tags.yaml
-
ansible预置的5个特殊tag
- always : 这个任务总是会被执行。
- never : 这个任务从不执行。
- tagged: 表示只执行有标签的任务。
- untagged : 表示只执行没有标签的任务。
- all : 表示所有任务会被执行,默认标签.不用指定。
如果多个任务的tags标签的值中,存在always关键字,会执行所有有always关键字对应的任务。
不执行标签中包含always的任务,可以使用--skip-tags选项跳过。
例如:该命令跳过所有包含always关键字的任务: ansible-playbook -S -R root --skip-tags always tags.yaml 只执行有标签的任务: ansible-playbook -S -R root --tags tagged tags.yaml 跳过包含标签和always关键字的任务: ansible-playbook -S -R root --skip-tags tagged tags.yaml 只执行没有标签的任务,若包含always关键字,任务也会执行: ansible-playbook -S -R root --tags untagged tags.yaml