我有一个角色,负责从 git 更新项目源代码,我们将其命名为source_tree
。Git 存储库包含多个服务使用的源代码,因此我想如果检测到 git 中的更改,则在每个主机上重新启动使用该源的所有服务。
IE:
- git: repo=ssh://[email protected]/mylogin/hello.git dest=/home/mylogin/hello
notify: restart everything dependent on source code
例如,我有角色webapp
、notification_service
、celery
。主机可以具有任何一组这样的角色,例如第一台服务器运行webapp
,第二台服务器运行notification_service
和celery
。所有这些服务都使用来自同一目录的源代码。
问题是:
我无法列出所有处理程序,
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_tree
和webapp
角色的剧本,但没有notification_service
和celery
。)并且没有办法忽略这个错误。
我无法创建具有相同名称的多个处理程序,只有一个(最后定义的)会生效。
如何克服这些限制?
答案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
当然,这些变成了任务,而不是处理程序。