如何在Salt中手动触发cmd.wait脚本?

时间:2014-10-31 21:06:23

标签: salt-stack

假设我有一个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-resourcesindex-resources也会失败。但是my-repo成功了,现在有了最新的存储库检查。

所以我继续解决导致syncdb失败的问题,并且成功了。但现在我的cmd.watch脚本无法运行,因为my-repo未报告任何更改。

我需要触发一次load-resources,然后继续我希望它仅在回购更改时触发。现在,我可以将其更改为使用cmd.run,但实际上我有一堆处于类似状态的cmd.wait脚本,我真的不想必须通过并切换它们然后再切换回来。将人工更改引入git repo也是如此。涉及多个回购,这在许多方面令人讨厌。最后,我可以预见到这样的事情会再次发生,并且我想要一个确定的解决方案来处理这个案例,而不涉及一堆容易出错的手动干预。

那么,有没有办法手动触发这些cmd.watch脚本?或者是否有一种巧妙的方法来重新排列依赖关系,以便可以手动触发?

1 个答案:

答案 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文件会更简单。