Ansible如何重播通知

吉米·凯恩(Jimmy Kane)

目前,我正从人偶切换到Ansible,我对某些概念或至少Ansible的工作方式感到困惑。

有关设置的一些信息:

我正在使用Ansible Best Practices中的示例,并以几个角色(剧本)等类似方式来构造我的项目。

我正在使用Vagrant进行配置,并且该框是Saucy64 VBox。

混乱的来历:

当我配置并运行ansible时,任务开始执行,然后是通知堆栈。

例:

最后任务:

TASK: [mysql | delete anonymous MySQL server user for localhost] ************** 
<127.0.0.1> REMOTE_MODULE mysql_user user='' state=absent 
changed: [default] => {"changed": true, "item": "", "user": ""}

然后先通知:

NOTIFIED: [timezone | update tzdata] ****************************************** 
<127.0.0.1> REMOTE_MODULE command /usr/sbin/dpkg-reconfigure --frontend noninteractive tzdata
changed: [default] => {"changed": true, "cmd": ["/usr/sbin/dpkg-reconfigure", "--frontend", "noninteractive", "tzdata"], "delta": "0:00:00.224081", "end": "2014-02-03 22:34:48.508961", "item": "", "rc": 0, "start": "2014-02-03 22:34:48.284880", "stderr": "\nCurrent default time zone: 'Europe/Amsterdam'\nLocal time is now:      Mon Feb  3 22:34:48 CET 2014.\nUniversal Time is now:  Mon Feb  3 21:34:48 UTC 2014.", "stdout": ""}

现在一切都很好。随着角色的增加,越来越多的通知卡住了。

现在问题来了。

通知失败时,设置将照常停止。但是,通知堆栈为空!这意味着将不会执行所有在故障之后的通知!

如果是这样的话,那么如果您更改了apache的虚拟主机设置,并收到了有关apache服务重新加载的通知,那么它将丢失。

让我们举个例子(伪郎):

- name: Install Apache Modules
  notify: Restart Apache

- name: Enable Vhosts
  notify: Reload Apache

- name: Install PHP
  command: GGGGGG # throws an error

执行以上操作时:

  1. 已安装Apache模块
  2. 虚拟主机已启用
  3. PHP尝试安装失败
  4. 脚本退出
  5. (通知在哪里?)

现在,这一切似乎都合乎逻辑,但是Ansible再次尝试变得聪明(no!*)堆积通知,因此重新加载和重新启动apache将导致在配置结束时一次重新启动apache。这意味着所有通知都将失败!!!

现在对于某些人来说,这里也很好。他们会说,嘿,只要重新运行配置,通知就会启动,因此apache最终将被重新加载,站点将再次启动。不是这种情况。

在更正了用于安装php的代码之后,在脚本的第二次运行中,由于设计原因,通知将不会运行为什么?

这就是为什么:Ansible将成功执行的任务标记为“完成/绿色”,因此不会为这些任务注册任何通知。设置将成功,并且为了触发通知并因此重新启动apache,您可以执行以下操作之一:

  1. 通过ansible或ssh对服务器运行直接命令
  2. 编辑脚本以触发任务
  3. 为此添加一个单独的任务
  4. 销毁Box实例并重新配置

这很令人沮丧,因为需要彻底清理盒子,还是使用Ansible无法正确理解某些内容?

还有另一种方法可以“回收” /重放/强制执行通知吗?

  • 聪明的办法是将任务标记为未完成,然后重新启动通知,或者将通知作为自己的任务保留在单独的队列中。*
里科

是的,与Puppet相比,这是Ansible的缺点之一。木偶是声明性的,不会像Ansible(或Chef)那样出错。它有其优点和缺点,例如,Puppet需要一些时间才能开始运行,因为它需要编译其目录。

因此,如果您的Ansible脚本出错,那么您的通知更新将不会发生,这是正确的。解决这个问题的唯一方法是使用条件语句。在您的剧本中,您可以执行以下操作:

- name: My cool playbook
  hosts: all

  vars:
      force_tasks: 0

  tasks:
    - name: Apache install
      action: apt pkg=$item state=latest
      with_items:
       - apache2
       - apache2-mpm-prefork

    - name: Restart apache
      action: service name=apache2 state=restart
      when: force_tasks

然后,当您运行剧本时,可以将force_tasks作为环境变量传递:

ansible-playbook -i my_inventory -e "force_tasks=True" my_ansible_playbook.yml

您可以使用标签以类似方式完成此操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ansible如何重播通知

来自分类Dev

如何实现重播功能?

来自分类Dev

有重播条件时的ansible剧本

来自分类Dev

HTTPS如何防止重播攻击?

来自分类Dev

如何使用Android进行重播?

来自分类Dev

如何使用VLC的AB重播功能?

来自分类Dev

如何防止这种“重播缓存”行为?

来自分类Dev

您如何仅基于条件通知Ansible中的处理程序?

来自分类Dev

Redux路由器-刷新后如何重播状态?

来自分类Dev

全局内存缓存重播如何超过100%?

来自分类Dev

如何在JavaScript草图中重播录制的音频?

来自分类Dev

如何在Android Studio VideoView中自动重播视频

来自分类Dev

如何使用Javascript正确重播任何Flash .swf文件?

来自分类Dev

RAC信号并重播。如何处理错误?

来自分类Dev

如何在omnet ++中使用AODV协议实施重播攻击?

来自分类Dev

如何阻止Apache Storm消息在拓扑结构的中间重播?

来自分类Dev

重播时如何从内存中删除级别1?

来自分类Dev

如何在python中列出'ls /usr/share/applications'的重播

来自分类Dev

每次用户点击时如何重播这个 CSS 动画?

来自分类Dev

如何将我的桌面记录到“重播缓冲区”中,以便可以重播最近的x秒?

来自分类Dev

Ansible处理程序通知vs注册

来自分类Dev

Ansible 通知:sudo sysctl -p --system

来自分类Dev

如何根据访问日志行中存在的时间戳使jmeter执行日志重播

来自分类常见问题

如何针对不同的上下文重播/投影Axon4中的事件?

来自分类Dev

如何在使用php的登录系统中使用随机数以避免重播攻击?

来自分类Dev

如何将提交重播到已经包含提交的分支上?

来自分类Dev

如何解决Codeigniter中的漏洞问题(权限升级,会话重播攻击和HSTS丢失)

来自分类Dev

即使遇到-11!(-2;`path)也遇到wsfull错误时,如何重播TP日志文件。

来自分类Dev

在Kafka中,如何在两个偏移量之间重播kafka使用者?

Related 相关文章

  1. 1

    Ansible如何重播通知

  2. 2

    如何实现重播功能?

  3. 3

    有重播条件时的ansible剧本

  4. 4

    HTTPS如何防止重播攻击?

  5. 5

    如何使用Android进行重播?

  6. 6

    如何使用VLC的AB重播功能?

  7. 7

    如何防止这种“重播缓存”行为?

  8. 8

    您如何仅基于条件通知Ansible中的处理程序?

  9. 9

    Redux路由器-刷新后如何重播状态?

  10. 10

    全局内存缓存重播如何超过100%?

  11. 11

    如何在JavaScript草图中重播录制的音频?

  12. 12

    如何在Android Studio VideoView中自动重播视频

  13. 13

    如何使用Javascript正确重播任何Flash .swf文件?

  14. 14

    RAC信号并重播。如何处理错误?

  15. 15

    如何在omnet ++中使用AODV协议实施重播攻击?

  16. 16

    如何阻止Apache Storm消息在拓扑结构的中间重播?

  17. 17

    重播时如何从内存中删除级别1?

  18. 18

    如何在python中列出'ls /usr/share/applications'的重播

  19. 19

    每次用户点击时如何重播这个 CSS 动画?

  20. 20

    如何将我的桌面记录到“重播缓冲区”中,以便可以重播最近的x秒?

  21. 21

    Ansible处理程序通知vs注册

  22. 22

    Ansible 通知:sudo sysctl -p --system

  23. 23

    如何根据访问日志行中存在的时间戳使jmeter执行日志重播

  24. 24

    如何针对不同的上下文重播/投影Axon4中的事件?

  25. 25

    如何在使用php的登录系统中使用随机数以避免重播攻击?

  26. 26

    如何将提交重播到已经包含提交的分支上?

  27. 27

    如何解决Codeigniter中的漏洞问题(权限升级,会话重播攻击和HSTS丢失)

  28. 28

    即使遇到-11!(-2;`path)也遇到wsfull错误时,如何重播TP日志文件。

  29. 29

    在Kafka中,如何在两个偏移量之间重播kafka使用者?

热门标签

归档