首页 文章

Ansible Handler通知vs注册

提问于
浏览
43

因此,在阅读Ansible文档后,我发现只有在任务报告更改时才会触发 Handlers ,例如:

some tasks ...
notify: nginx_restart

# our handler
- name: nginx_restart

VS

some tasks ...
register: nginx_restart

# do this after nginx_restart changes
when: nginx_restart|changed

这两种方法有什么区别吗?我什么时候应该使用它们?对我来说, register 似乎在这里有更多功能,除非我遗漏了一些东西......

3 回答

  • 59

    有一些差异,哪个更好取决于具体情况 .

    处理程序只有在实际执行时才会在输出中可见 . 未通知,Ansibles输出中将没有跳过的任务 . 无论是否跳过任务,无论是否更改,任务始终都有输出 . (除了它们通过标签/ skip-tags排除)

    可以从任何角色调用处理程序 . 如果你有更复杂的角色相互依赖,这会很方便 . 假设您有管理iptables的角色,但您定义的规则实际上取决于其他角色(例如数据库角色,redis角色等...)每个角色都可以将其规则添加到配置文件中,最后通知iptables如果更改,则重新加载iptables的角色 .

    默认情况下,处理程序在剧本结束时执行 . 任务将在定义它们的位置立即执行 . 这样您就可以配置所有应用程序,最后,每个处理程序将触发所有已更改应用程序的服务重启 . 但这可能很危险 . 如果在通知处理程序后您的playbook失败,则实际上不会调用该处理程序 . 如果再次运行该剧本,则触发任务可能不再具有已更改的状态,因此不会通知处理程序 . 这导致Ansible实际上不是幂等的 . 从Ansible 1.9.1开始,您可以使用 --force-handler 选项调用Ansible,或者在 ansible.cfg 中定义 force_handlers = True ,甚至在剧本失败后触发所有通知的处理程序 . (See docs

    如果您需要在特定点触发处理程序(例如,您将系统配置为使用内部DNS并且现在希望通过此DNS解析主机),则可以通过定义以下任务来刷新所有处理程序:

    - meta: flush_handlers
    

    无论通知多少次,都只会调用一次处理程序 . 想象一下,你有一个依赖于多个配置文件的服务(例如bind / named:rev,zone,root.db,rndc.key,named.conf),如果这些文件中的任何一个发生了变化,你想重新命名 . 使用处理程序,您只需通知管理这些文件的每个任务 . 否则,您需要注册5个无用的变量,然后在重新启动任务中检查它们 .

    我个人更喜欢处理程序 . 它似乎比处理 register 更清洁 . 在Ansible 1.9.1之前,每个寄存器触发的任务更安全 .

  • 3

    Ansible Variables页面上,您可以看到 register 的工作原理 .

    变量的另一个主要用途是运行命令并使用该命令的结果将结果保存到变量中 .

    注册变量就像事实一样:

    有效注册的变量就像事实一样 .

    这与触发处理程序的 notify 非常不同 . 它不保存或存储变量或事实 .

  • 0

    使用 ignore_errors: True 可以避免失败的处理程序停止继续运行后定义的其他处理程序

相关问题