Ansible中的处理程序详解

在Ansible中,处理程序(handlers)用于定义在任务(tasks)完成后需要执行的动作。处理程序常用于重新启动服务或执行其他特定操作。使用处理程序可以确保只有在任务实际改变了系统状态后,才会触发相应的操作。

1. 修改配置文件成功后重启FTP服务

- name: 修改配置文件成功后,重启FTP服务
  hosts: web
  tasks:
    - name: 修改FTP配置
      lineinfile:
        path: /etc/vsftpd/vsftpd.conf
        regexp: '^anonymous_enable=YES'
        line: 'anonymous_enable=NO'
      notify:
        - restart vsftpd

  handlers:
    - name: restart vsftpd
      service:
        name: vsftpd
        state: restarted
  1. notify用于指明触发什么程序,其后跟随的是处理程序的名字。
  2. handlers用来定义处理程序的实际动作。
  3. 只有当任务执行时发生了改变,才能触发动作。lineinfile模块会根据指定的正则表达式regexp查找匹配行,如果找到匹配行则替换为新的内容line,否则添加该行。

2. 删除指定行后重启FTP服务

- name: 修改配置文件(删除指定行后)重启FTP服务
  hosts: web
  tasks:
    - name: 修改FTP配置
      lineinfile:
        path: /etc/vsftpd/vsftpd.conf
        state: absent
        regexp: '^#test'
      notify:
        - restart vsftpd

  handlers:
    - name: restart vsftpd
      service:
        name: vsftpd
        state: restarted
  1. 删除匹配到的行,如果没有匹配到,该任务不会有变化发生。
  2. 没有变化发生就不会触发处理程序。

3. 下载配置文件并启动服务

- name: 下载配置文件并启动服务
  hosts: web
  tasks:
    - name: 拷贝模板配置文件
      template:
        src: /data/templates/demo.example.conf.template
        dest: /etc/httpd/conf.d/demo.example.com
      notify:
        - restart apache
        - restart mariadb

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

    - name: restart apache
      service:
        name: httpd
        state: restarted
  1. 处理程序始终按照play的handlers部分指定的顺序运行,不按notify指定的顺序。
  2. 处理程序在play中其他任务完成后才运行。
  3. 无通知不执行处理程序,有多个任务通知,处理程序仅运行一次,不会多次运行处理程序。

详细举例

- name: 配置数据库
  hosts: db_server
  tasks:
    - name: 下载数据库配置文件
      get_url:
        url: ftp://yourftpserver/config/db_config.conf
        dest: /etc/db_config.conf
      notify:
        - setup database

  handlers:
    - name: setup database
      shell: |
        mysql -u root -e "source /etc/db_config.conf"
        mysql -u root -e "CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';"
        mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost';"
        mysql -u root -e "FLUSH PRIVILEGES;"
  1. 下载数据库配置文件后触发setup database处理程序。
  2. setup database处理程序执行一系列shell命令来配置数据库,包括导入配置文件、创建用户、设置权限等。

处理程序使用注意事项

  1. notify 用于指明触发哪个处理程序,其后跟随的是处理程序的名字。
  2. handlers 用来定义处理程序的实际动作。
  3. 只有当任务执行时发生了变化,才能触发处理程序。否则处理程序不会执行。
  4. lineinfile 模块中,不管之前是否有匹配行,都会进行添加,结果都是 change。

Ansible中的处理程序可以帮助我们在任务完成后自动执行一些后续操作,确保系统处于预期状态。通过使用 notifyhandlers,我们可以高效地管理复杂的自动化流程。

本文由mdnice多平台发布


逼格高的汤圆
10 声望2 粉丝