首页 > 解决方案 > 是否有退出状态执行的本机方式?

问题描述

这是场景。当 osarch 等于 x86 时做某事,当它等于 aarch64 时再做另一件事,否则退出状态执行。那么有没有像 Ansible 中的“meta: end_play”这样的方法,以便我可以将它放入 {% else %} 部分以在不满足条件时退出?

{% if grains['osarch'] == 'aarch64' %}
plan A:
  cmd.run:
      - name: echo a
{% elif grains['osarch'] == 'x86' %}
plan B:
  cmd.run:
      - name: echo b
{% else %}
  HOW TO QUIT THE STATE???
{% endif %}

标签: salt-stack

解决方案


因此,该else部分不是强制性的。如果条件都不匹配,则无论如何都不会执行任何操作。

从您的代码:

  • 如果osarch匹配aarch64,则Plan A执行。
  • 如果osarch匹配x86,则Plan B执行。
  • 如果osarch不是以上任何一个,则不采取任何措施。

因此,当条件不匹配时停止执行的“优雅”方式是:

{% if grains['osarch'] == 'aarch64' %}
plan-A:
  cmd.run:
  - name: echo a
{% elif grains['osarch'] == 'x86' %}
plan-B:
  cmd.run:
  - name: echo b
{% endif %}

但是,如果您确实想通知用户您希望osarch匹配某些东西,但它没有。然后你可以使用 Saltstack测试状态模块。它有一个名为fail_without_changes. 如果没有任何条件匹配,我们可以使用它来引发异常(并使运行失败)。

例子:

{% if grains['osarch'] == 'aarch64' %}
plan-A:
  cmd.run:
  - name: echo a
{% elif grains['osarch'] == 'x86' %}
plan-B:
  cmd.run:
  - name: echo b
{% else %}
fail-the-run:
  test.fail_without_changes:
  - name: OS arch not matched, bailing out.
  - failhard: True
{% endif %}

failhard这里需要,因为 Saltstack 中的默认行为是运行所有状态。但是如果我们需要停止执行,我们需要添加这个选项。

请注意,这与failAnsible 中的相似性大于meta: end_play.


推荐阅读