huy*_*ygn 51 ansible ansible-playbook
因此,在阅读Ansible文档后,我发现Handlers只有在任务报告更改时才会触发,例如:
some tasks ...
notify: nginx_restart
# our handler
- name: nginx_restart
Run Code Online (Sandbox Code Playgroud)
VS
some tasks ...
register: nginx_restart
# do this after nginx_restart changes
when: nginx_restart|changed
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别吗?我什么时候应该使用它们?对我来说,register这里似乎有更多的功能,除非我遗漏了一些东西......
udo*_*dan 67
有一些差异,哪个更好取决于具体情况.
处理程序只有在实际执行时才会在输出中可见.未通知,Ansibles输出中将没有跳过的任务.无论是否跳过任务,无论是否更改,任务始终都有输出.(除了它们通过标签/ skip-tags排除)
可以从任何角色调用处理程序.如果你有更复杂的角色相互依赖,这会很方便.假设您有管理iptables的角色,但您定义的规则实际上取决于其他角色(例如数据库角色,redis角色等...)每个角色都可以将其规则添加到配置文件中,最后通知iptables如果更改,则重新加载iptables的角色.
默认情况下,处理程序在剧本结束时执行.任务将在定义它们的位置立即执行.这样您就可以配置所有应用程序,最后,每个处理程序将触发所有已更改应用程序的服务重启.但这可能很危险.如果在通知处理程序后您的playbook失败,则实际上不会调用该处理程序.如果再次运行该剧本,则触发任务可能不再具有已更改的状态,因此不会通知处理程序.这导致Ansible实际上不是幂等的.由于Ansible 1.9.1可以调用Ansible与--force-handler选项或定义force_handlers = True你ansible.cfg甚至解雇所有通知处理后的剧本失败.(见文档)
如果您需要在特定点触发处理程序(例如,您将系统配置为使用内部DNS并且现在希望通过此DNS解析主机),则可以通过定义以下任务来刷新所有处理程序:
- meta: flush_handlers
Run Code Online (Sandbox Code Playgroud)
无论通知多少次,都只会调用一次处理程序.想象一下,你有一个依赖于多个配置文件的服务(例如bind/named:rev,zone,root.db,rndc.key,named.conf),如果这些文件中的任何一个发生了变化,你想重新命名.使用处理程序,您只需通知管理这些文件的每个任务.否则,您需要注册5个无用的变量,然后在重新启动任务中检查它们.
我个人更喜欢处理程序.它似乎比处理更清洁register.在Ansible 1.9.1之前,每个寄存器触发的任务更安全.
在Ansible Variables页面上,您可以查看其register工作原理。
变量的另一个主要用途是运行命令,并使用该命令的结果将结果保存到变量中。
注册变量就像事实:
有效注册的变量就像事实一样。
这notify与触发处理程序的完全不同。它不保存或存储变量或事实。
| 归档时间: |
|
| 查看次数: |
49621 次 |
| 最近记录: |