虚拟化容器,大数据,DBA,中间件,监控。

ansible中handlers和notify结合使用触发条件

21 05月
作者:admin|分类:系统运维

自己的理解:handlers用来用来解决触发时间的,也就是当一个tasks真正的执行后,结果发生了变化。会去触发另一个task。

handlers和notify结合使用触发条件:

·Handlers(触发器)

  是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。

·Notify(通知)

  此action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成最后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。


现实中的应用场景:

        当我们修改了某些程序的配置文件以后,有可能需要重启应用程序,以便能够使新的配置生效,那么,物品,么如何使用playbook?


例子:加入我们要修改server的端口从80改成8080,并且在修改配置之后重启nginx。剧本如下:

那么想想如果我们不加上handlers的效果,不加handlers,修改配置的task和重启服务的task并没有逻辑性,依赖性。第一次执行这个playbook不会有什么问题,当第二次执行时,会发现根据幂等性特性修改配置文件的task并没有执行,而重启服务的task还是会执行,显然这是不合理的,我们要求是只有配置文件发生变化之后再重启服务。

202005211644379461884.png


针对handlers的理解:

handlers可以理解成另一种tasks,handlers是另一种’任务列表‘,handlers的任务会被tasks中的任务进行”调用“,但是,被”调用“并不意味着一定会执行,只有当tasks中的任务”真正执行“以后,handlers中被调用的任务才会执行,如果tasks中的任务并没有做出任何实际的操作,那么handlers中的任务即使被’调用‘,也并不会执行。

202005211644379095277.png

如上所说,handlers是另一种任务列表,可以理解handlers和tasks是’平级关系‘,所以他们的缩进相同,上面的handlers中只有一个任务,任务的名称为restart nginx,这个名词被tasks中的modify the configuration这个任务调用了,notify字段就是调用handlers任务,当modify the configuration这个任务执行之后并发生了改变,就会去执行handlers中的相应的任务。



handlers是另一种任务列表,所以handlers中可以有多个任务,被tasks中不同的任务notify,如下:

202005211644376962450.png

如上所示,tasks和handlers都是任务列表,只是handlers中的人物被tasks中的任务notify罢了,那么我们来执行一下上述playbook,如下图所以:

202005211644375918703.png

从上图看出,handlers执行的顺序与handlers在playbook中定义的顺序是相同的,与handlers被notify的顺序无关,默认情况下,所有的task执行完毕后,才会执行各个handles,并不是执行完某个task后,立即执行相应的handler,如果想要在执行完某些task以后立即执行对应的handlre,那么需要使用meta模块。

202005211644372159328.png

结果显示顺序: task1--->task2--->handler1--->handler2--->task3--->handler3.



浏览1550 评论0
返回
目录
返回
首页
Ansible 中的register注册变量 var_prompt交互变量 命令行传入变量 CentOS7/RHEL7制作openssh-8.2p1的RPM安装包,去掉版本号,规避漏洞扫描