Ansible 中的 Pubsub 样式通知/处理程序(当源代码发生变化时使用源代码重新启动所有服务)

Ansible 中的 Pubsub 样式通知/处理程序(当源代码发生变化时使用源代码重新启动所有服务)

我有一个角色,负责从 git 更新项目源代码,我们将其命名为source_tree。G​​it 存储库包含多个服务使用的源代码,因此我想如果检测到 git 中的更改,则在每个主机上重新启动使用该源的所有服务

IE:

- git: repo=ssh://[email protected]/mylogin/hello.git dest=/home/mylogin/hello
  notify: restart everything dependent on source code

例如,我有角色webappnotification_servicecelery。主机可以具有任何一组这样的角色,例如第一台服务器运行webapp,第二台服务器运行notification_servicecelery。所有这些服务都使用来自同一目录的源代码。

问题是:

  • 我无法列出所有处理程序,notify例如:

    - git: repo=ssh://[email protected]/mylogin/hello.git dest=/home/mylogin/hello
      notify: 
        - restart webapp
        - restart notification service
        - restart celery
    

    因为如果我运行没有所有角色的剧本(或者即使主机不包含所有角色),剧本将会失败并出现错误:

    ERROR: change handler (restart celery) is not defined

    (即,我有webapp.yml包含source_treewebapp角色的剧本,但没有notification_servicecelery。)

    并且没有办法忽略这个错误。

  • 我无法创建具有相同名称的多个处理程序,只有一个(最后定义的)会生效。

如何克服这些限制?

答案1

我还没有跨角色测试过,但你可以尝试注册 git 任务的结果

- git: repo=ssh://[email protected]/mylogin/hello.git dest=/home/mylogin/hello
  register: gitrc

然后从每个角色的角度朗读。例如,

webapp/tasks/main.yml

- supervisorctl: name=uwsgi state=restarted
  when: gitrc|changed

celery/tasks/main.yml

- supervisorctl: name=celery state=restarted
  when: gitrc|changed

当然,这些变成了任务,而不是处理程序。

相关内容