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任务列表。

image-20241016194716635

只调用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