假设我有一个cmd.wait脚本,它监视托管git存储库的更改。即使回购没有改变,触发该脚本的最佳方法是什么?
以下是该方案:
my-repo:
git.latest:
- name: git@github.com:my/repo.git
- rev: master
- target: /opt/myrepo
- user: me
- require:
- pkg: git
syncdb:
cmd.run:
- name /opt/bin/syncdb.sh
load-resources:
cmd.wait:
- name: /opt/bin/load_script.py /opt/myrepo/resources.xml
- require:
- cmd: syncdb
- watch:
- git: my-repo
index-resources:
cmd.wait:
- name: /opt/bin/indexer.sh
- watch:
- cmd: load-resources
假设我运行此状态,但syncdb
失败。由于缺少先决条件,load-resources
和index-resources
也会失败。但是my-repo
成功了,现在有了最新的存储库检查。
所以我继续解决导致syncdb
失败的问题,并且成功了。但现在我的cmd.watch
脚本无法运行,因为my-repo
未报告任何更改。
我需要触发一次load-resources
,然后继续我希望它仅在回购更改时触发。现在,我可以将其更改为使用cmd.run
,但实际上我有一堆处于类似状态的cmd.wait
脚本,我真的不想必须通过并切换它们然后再切换回来。将人工更改引入git repo也是如此。涉及多个回购,这在许多方面令人讨厌。最后,我可以预见到这样的事情会再次发生,并且我想要一个确定的解决方案来处理这个案例,而不涉及一堆容易出错的手动干预。
那么,有没有办法手动触发这些cmd.watch
脚本?或者是否有一种巧妙的方法来重新排列依赖关系,以便可以手动触发?
答案 0 :(得分:2)
假设上面的sls位于:/srv/salt/app.sls
,那么你应该能够执行load-resources
:
$: salt '*appserver*' state.sls_id load-resources app base
那就是说,肯定有很多更好的方法可以做到这一点,这样你就不必手动处理失败。
您可以将load-resources
更改为cmd.run
使用unless
命令,该命令实际检查资源是否已加载。如果在商业术语中无法做到这一点(即没有简单的方法可以检查),那么泛型就可以做到,这可以像你在load_script.py
末尾创建的文件一样简单。该文件可以包含导入时git仓库的提交ID,如果文件不存在或文件中的提交ID与当前git仓库的提交ID不同,则您知道必须重新导入。
更好的变化是将unless
逻辑烘焙到load_script.py
,这会使该脚本具有幂等性。就像所有盐模块一样。那么你的SLS文件会更简单。