Проверить существование файла и создать символическую ссылку

Я хочу сделать что-то вроде этого:

если файл A существует или нет символической ссылки B, я хочу создать символическую ссылку B -> A.

На данный момент у меня есть:

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

Но это плохо, он проверяет не то, что я хочу. Как я могу добиться этой простой вещи в соли?


person Darek    schedule 26.03.2014    source источник
comment
Обратите внимание, что есть шанс, что ваше состояние будет непоследовательным. У нас не может быть более одного вызова функции из одного и того же модуля состояния. (например, file). Под идентификатором B у вас не может быть file.symlink И file.exists, потому что обе функции являются частью одного и того же модуля состояния. Это вызвано тем, как Salt обрабатывает списки внутри, в конечном итоге останется только один.   -  person renoirb    schedule 22.04.2015


Ответы (3)


Мы можем использовать file.directory_exists

{% if not salt['file.directory_exists' ]('/symlink/path/A') %}
symlink:
  file.symlink:
    - name: /path/to/A
    - target: /symlink/path/A
{% endif %}
person Abhilash Joseph    schedule 26.05.2015
comment
...или file_exists для проверки существования файла. - person Ztyx; 03.11.2015
comment
Это должен быть принятый ответ, он намного понятнее и легче читается. - person David Fairbanks; 02.06.2016
comment
Мне бы это очень понравилось, за исключением того, что мне нужна переменная в {%, если .... '/symlink/{{ здесь }}/A' - person GerardJP; 23.03.2017
comment
@GerardJP, если вам нужна переменная, объедините ее с предложением соединения: {% if .... ['/symlink/', VARIABLE,'/A'] | join ('') %} - person Pedreiro; 24.05.2017

Вам следует использовать отличный ответ Дэна Гартуэйта здесь в качестве основы для проверки существования файла. Я изменил его решение, чтобы ответить на ваш вопрос.

{% if 1 == salt['cmd.retcode']('test -f /path/to/A') %}
/path/to/A:
  file.symlink:
    - target: /symlink/path/A
{% endif %}
person Jason Zhu    schedule 26.03.2014
comment
См. другой ответ для лучшего решения: stackoverflow.com/a/30454953/13713 - person Joel; 22.11.2016
comment
Недостатком этого решения является то, что, хотя из-за этого у вас не будет никакого состояния сбоя, у вас могут быть некоторые дополнительные сообщения об ошибках в выводе соли, когда файл /path/to/A не существует. - person Pedreiro; 24.05.2017
comment
Я только что наткнулся на это пять лет спустя, и там я отвечаю себе 5 лет назад. - person Dan Garthwaite; 22.10.2019

/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, состояние не будет выполняться.

ПРИМЕЧАНИЕ. Под капотом только если вызывается cmd.retcode с python_shell=True. Это означает, что команды, на которые ссылается onlyif, будут анализироваться оболочкой, поэтому остерегайтесь побочных эффектов, поскольку эта оболочка будет запускаться с теми же привилегиями, что и salt-minion. Также имейте в виду, что логическое значение определяется концепцией True и False оболочки, а не концепцией Python True и False.

person bgdnlp    schedule 09.09.2020