Ansible的handlers
什么是handlers?
handler用来执行某些条件下的任务,比如当配置文件发生变化的时候,通过notify触发handler去重启服务。
在saltstack中也有类似的触发器,写法相对Ansible简单,只需要watch,配置文件即可。
实践案例
cat handler.yml
- hosts: aa_group
vars:
- http_port: 8080
tasks:
- name: Install Http Server
apt:
name: apache2
state: present
- name: config httpd server
template:
src: ./httpd.j2
dest: /etc/httpd/conf
notify:
- Restart Httpd Server ## 如果有文件发生改动则出发
- Restart PHP Server ## 同上
- name: start httpd server
service:
name:httpd
state: started
enabled: yes
handlers:
- name: Restart Httpd Server
systemd:
name: httpd
state: restarted
- name: Restart PHP Server
systemd:
name: php-fpm
state: restarted
注意:
1.无论多少个task通知了相同的handlers,handlers仅会在所有tasks结束后运行一次。
2.Handlers只有在其所在的任务被执行时,才会被运行;如果一个任务中定义了notify调用Handlers,但是由于条件判断等原因,该任务未被执行,那么Handlers同样不会被执行。
3.Handlers只会在每一个play的末尾运行一次;如果想在一个playbook中间运行Handlers,则需要使用meta模块来实现。例如: -meta: flush_handlers。
4.如果一个play在运行到调用Handlers的语句之前失败了,那么这个Handlers将不会被执行。我们可以使用meta模块的--force-handlers选项来强制执行Handlers,即使Handlers所在的play中途运行失败也能执行。
5.不能使用handlers替代tasks
playbook的任务标签
默认情况下,Ansible在执行一个playbook时,会执行playbook中定义的所有任务,Ansible的标签(tag)功能可以给单独任务甚至整个playbook打上标签,然后利用这些标签来指定要运行playbook中的个别任务,或不执行指定的任务
打标签的方式
1.对一个task打一个标签 2.对一个task打多个标签 3.对多个task打一个标签
打完标签如何使用
-t:执行指定的tag标签任务 --skip-tags:执行--skip-tags之外的标签任务
[root@m01 m01]# cat tag.yml
- hosts: web_group
vars:
- http_port: 8080
tasks:
- name: Install Http Server
apt:
name: apache
state: present
tags:
- install_httpd
- httpd_server
- name: configure httpd server
template:
src: ./httpd.j2
dest: /etc/httpd/conf/httpd.conf
notify: Restart Httpd Server
tags:
- config_httpd
- httpd_server
- name: start httpd server
service:
name: httpd
state: started
enabled: yes
tags: service_httpd
handlers:
- name: Restart Httpd Server
systemd:
name: httpd
state: restarted
# 列出 Playbook 中所有定义的标签。可以帮助你了解可用的任务或角色。
ansible-playbook tag.yml --list-tags
# 仅运行带有 httpd_server 标签的任务。这是选择性执行任务的一种方式。
ansible-playbook tag.yml -t httpd_server
# 运行带有 install_httpd 和 configure_httpd 标签的任务。多个标签用逗号分隔。
ansible-playbook tag.yml -t install_httpd,confiure_httpd
# 跳过带有 httpd_server 标签的任务。用于排除特定任务的执行。
ansible-playbook tag.yml --skip-tags httpd_server
Playbook文件复用
在之前写playbook的过程中,我们发现,写多个playbook没有办法,一键执行,这样我们还要单个playbook挨个去执行,很鸡肋。所以在playbook中有一个功能,叫做include
用来动态调用task任务列表。
只调用task:include_tasks
调用整个task文件:include (新版本:import_playbook)
在saltstack中,叫做top file入口文件。
cat task.yml
- hosts: web_group
vars:
- http_port: 8080
tasks:
- include_tasks: task_install.yml
- include_tasks: task_configure.yml
- include_tasks: task_start.yml
handlers:
- name: Restart Httpd Server
systemd:
name: httpd
state: restarted
cat task_install.yml
- name: Install Http Server
apt:
name: nginx
state: present
cat task_configure.yml
- name: configure httpd server
template:
src: ./httpd.j2
dest: /etc/httpd/conf/httpd.conf
notify: Restart Httpd Server
cat task_start.yml
- name: start httpd server
service:
name: httpd
state: started
enabled: yes
### 实例二
- include: httpd.yml
- include: nfs.yml
- include: rsync.yml
### 示例三
- import_playbook: httpd.yml
- import_playbook: nfs.yml
- import_playbook: rsync.yml