12

我想做这样的事情:

如果文件 A 存在或没有符号链接 B,我想创建一个符号链接 B -> A。

现在我有:

 B:
   file:
    - symlink:
       - target: A
    - exists:
        - name: A

但这很糟糕,它检查的不是我想要的东西。我怎样才能在盐中实现这个简单的东西?

4

3 回答 3

45

我们可以用file.directory_exists

{% if not salt['file.directory_exists' ]('/symlink/path/A') %}
symlink:
  file.symlink:
    - name: /path/to/A
    - target: /symlink/path/A
{% endif %}
于 2015-05-26T09:42:45.320 回答
11

您应该在这里使用Dan Garthwaite的出色答案作为如何检查文件是否存在的基础。我已经修改了他的解决方案来回答你的问题。

{% if 1 == salt['cmd.retcode']('test -f /path/to/A') %}
/path/to/A:
  file.symlink:
    - target: /symlink/path/A
{% endif %}
于 2014-03-26T23:04:58.630 回答
1
/path/to/symlink/B:
  file.symlink:
    - target: /path/to/target/A
    - onlyif:
      - test -f /path/to/target/A      # check that the target exists
      - test ! -L /path/to/symlink/B   # check that B is not a symlink

这将要求两个条件都为 True 才能创建符号链接。请注意,-L如果文件存在但不是符号链接,也会返回 1 (False)。

文档

onlyif 必要条件指定如果 onlyif 中列出的每个命令都返回 True,则状态为运行。如果任何指定的命令返回 False,则状态将不会运行。

注意:仅当使用 python_shell=True 调用 cmd.retcode 时。这意味着 onlyif 引用的命令将由 shell 解析,因此请注意副作用,因为此 shell 将以与 salt-minion 相同的权限运行。另请注意,布尔值是由 shell 的 True 和 False 概念决定的,而不是 Python 的 True 和 False 概念。

于 2020-09-09T18:08:58.087 回答