SaltStack无法在minion端检测文件是否存在问题咨询
问题成因
SaltStack执行SLS配置时会依次走两个独立阶段:
- 第一阶段是Jinja模板渲染阶段:Salt会先解析SLS文件里的所有Jinja语法,所有写在
{% %}块内的Salt模块调用会在这一步直接执行,这个阶段还不会执行任何你定义的状态任务。 - 第二阶段是状态执行阶段:等Jinja把整个SLS渲染成纯状态配置后,才会从上到下依次执行你定义的
create、output等状态任务。
你写的{% set output = salt['cmd.run']("ls /tmp/filex") %}属于第一阶段的执行逻辑,此时create任务的touch /tmp/filex操作还没有运行,自然会报文件不存在的错误。即便你后续手动提前创建了文件,这个执行顺序的问题依然存在,只要你在Jinja里的检查逻辑早于状态阶段的文件创建操作,就会触发报错。
解决方法
核心逻辑是把文件存在性检查放到状态执行阶段运行,不要放在Jinja渲染阶段,推荐两种方案:
方案1:用cmd.run的onlyif/unless参数做判断
这是最符合SaltStack幂等性设计的写法,示例如下:
# 先创建目标文件 create_tmp_file: cmd.run: - name: touch /tmp/filex # 文件存在时执行 print_exist_info: cmd.run: - name: echo "/tmp/filex 存在" - onlyif: test -f /tmp/filex # 文件不存在时执行 print_not_exist_info: cmd.run: - name: echo "/tmp/filex 不存在" - unless: test -f /tmp/filex
方案2:把检查逻辑直接写到状态的命令里
如果只是需要输出文件存在性结果,可以直接把检查逻辑合并到echo命令中:
{% set target_file = "/tmp/filex" %} create_file: cmd.run: - name: touch {{ target_file }} check_and_output: cmd.run: - name: 'ls {{ target_file }} >/dev/null 2>&1 && echo "文件{{ target_file }}存在" || echo "文件{{ target_file }}不存在"'
内容的提问来源于stack exchange,提问作者Sujeet Padhi
相关产品推荐
相关产品推荐

