问题描述
在通过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
目录下,以避免在应用状态时看到报告的更改。
解决方案
请注意以下操作可能会因版本差异而有所不同,请在进行操作前做好备份。
使用unless
或onlyif
属性
可以考虑在第一个指令中添加unless
或onlyif
属性,特别是如果script.sh
特别复杂或昂贵。通过使用unless
或onlyif
,你可以使用几个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中,您可以通过使用unless
或onlyif
属性来根据特定条件来控制临时脚本是否推送和执行,从而避免不必要的状态更改报告。另一种方法是将临时脚本保存在目标主机的临时目录中,以便在状态应用期间不会看到更改报告。根据您的需求和偏好,选择合适的方法来管理临时脚本。