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
- notify用于指明触发什么程序,其后跟随的是处理程序的名字。
- handlers用来定义处理程序的实际动作。
- 只有当任务执行时发生了改变,才能触发动作。
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
- 删除匹配到的行,如果没有匹配到,该任务不会有变化发生。
- 没有变化发生就不会触发处理程序。
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
- 处理程序始终按照play的handlers部分指定的顺序运行,不按notify指定的顺序。
- 处理程序在play中其他任务完成后才运行。
- 无通知不执行处理程序,有多个任务通知,处理程序仅运行一次,不会多次运行处理程序。
详细举例
- 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;"
- 下载数据库配置文件后触发setup database处理程序。
- setup database处理程序执行一系列shell命令来配置数据库,包括导入配置文件、创建用户、设置权限等。
处理程序使用注意事项
- notify 用于指明触发哪个处理程序,其后跟随的是处理程序的名字。
- handlers 用来定义处理程序的实际动作。
- 只有当任务执行时发生了变化,才能触发处理程序。否则处理程序不会执行。
- lineinfile 模块中,不管之前是否有匹配行,都会进行添加,结果都是 change。
Ansible中的处理程序可以帮助我们在任务完成后自动执行一些后续操作,确保系统处于预期状态。通过使用 notify
和 handlers
,我们可以高效地管理复杂的自动化流程。
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。