SaltStack - 无法检查文件是否存在于 minion 上

SaltStack - Unable to check if file exists on minion

我正在尝试使用 salt stack 检查 centos 主机上是否存在具有某些扩展名的特定文件。

 create:
   cmd.run:
     - name: touch /tmp/filex

{% set output = salt['cmd.run']("ls /tmp/filex") %}

output:
   cmd.run:
     - name: "echo {{ output }}"

即使文件存在,我也会收到如下错误:

ls: cannot access /tmp/filex: No such file or directory

在 SaltStack 中,Jinja 在 YAML 之前评估。文件创建将 (cmd.run) 在 Jinja 之后执行。所以你的 Jinja 变量是空的,因为文件还没有创建。

https://docs.saltproject.io/en/latest/topics/jinja/index.html

Jinja 语句,例如您的 set output 行,在呈现 sls 文件时,在执行其中的任何状态之前进行评估。它没有看到该文件,因为尚未创建该文件。

将检查移动到状态定义应该可以解决它:

output:
  cmd.run:
    - name: ls /tmp/filex
    # if your underlying intent is to ensure something runs only
    # once the file exists, you can enforce that here
    - require:
      - cmd: create

我看到您已经接受了关于首先渲染 jinja 的答案。这是真的。但我想补充一点,您不必使用 cmd.run 来检查文件。为此,盐中内置了一种状态。

file.exists 将以有状态的方式检查文件或目录是否存在。

关于盐的其中一件事是你应该尽可能地寻找远离cmd.run的方法。

create:
  file.managed:
    - name: /tmp/filex

check_file:
  file.exists:
    - name: /tmp/filex
    - require:
        - file: create