使用SaltStack临时脚本而不引起状态更改报告

37次阅读
没有评论

问题描述

在通过SaltStack执行与Kafka相关的操作时,使用脚本来执行这些操作。他的当前SLS文件大致如下:

/tmp/script.sh:
  file.managed:
    - source: salt://blah/blah

Run script:
  cmd.run:
    - name: /tmp/script.sh

delete /tmp/script.sh:
  file.absent:
    - name: /tmp/script.sh

其中的script.sh本身是幂等的。但是,每次应用状态后,他总是得到一个changed=2的状态报告,这是因为它首先将脚本放置在目标主机上,然后再将其删除。

用户想知道在SaltStack中是否有更具惯用性的方法来处理临时脚本,以避免将脚本保存在目标主机上。或者人们通常是否将脚本留在/tmp目录下,以避免在应用状态时看到报告的更改。

解决方案

请注意以下操作可能会因版本差异而有所不同,请在进行操作前做好备份。

使用unlessonlyif属性

可以考虑在第一个指令中添加unlessonlyif属性,特别是如果script.sh特别复杂或昂贵。通过使用unlessonlyif,你可以使用几个BASH命令的结果来确定是否需要推送和执行你的脚本。只有当系统出现问题时,才会执行状态。如果一切正常,脚本将永远不会被推送和执行,从而防止最终状态报告中出现changed=2。对于第二个和第三个指令,您将希望使用require属性,以防止它们在脚本未被file.managed推送的情况下运行,否则您将得到两个更改的错误而不是两个更改。
以下是一个示例unless属性的用法示例:

/tmp/script.sh:
  file.managed:
    - source: salt://blah/blah
    - unless: your_bash_command_to_check_conditions

在上面的示例中,将your_bash_command_to_check_conditions替换为您自己的用于检查条件的BASH命令。

使用这种方法,您可以根据特定的条件来决定是否需要将脚本推送和执行,从而避免不必要的状态更改报告。

使用临时目录

另一种方法是将临时脚本保存在目标主机的临时目录中,以避免在状态应用期间看到更改报告。您可以使用/tmp目录,也可以创建一个专门的临时目录。以下是在/tmp目录下保存临时脚本的示例:

/tmp/script.sh:
  file.managed:
    - source: salt://blah/blah

Run script:
  cmd.run:
    - name: /tmp/script.sh

delete /tmp/script.sh:
  file.absent:
    - name: /tmp/script.sh

通过在临时目录中保存脚本,您可以确保脚本不会长期保留在目标主机上,从而避免状态更改报告。

总结

在SaltStack中,您可以通过使用unlessonlyif属性来根据特定条件来控制临时脚本是否推送和执行,从而避免不必要的状态更改报告。另一种方法是将临时脚本保存在目标主机的临时目录中,以便在状态应用期间不会看到更改报告。根据您的需求和偏好,选择合适的方法来管理临时脚本。

正文完