Переменные соляного стека

У меня вопрос о переменных в соли. Я пытаюсь использовать операторы if для создания более сложных состояний с солью.

пример работы:

{% set old_stable = salt['cmd.run']('cd /home/project_name && ls -t|grep 2|grep -v tar.gz|tail -n +2|head -n 1') %}
{% set time_date = salt['cmd.run']('date +%Y%m%d%H%M') %}
{% if salt['cmd.run']('ls -lt /home/project_name/ | wc -l') == 2 %}
      <STATE>
{% endif  %}

Итак, вопрос: могу ли я определить "/home/project_name/" как переменную типа {{ old_stable }}, чтобы поместить ее поверх файла

Вставка переменной в оператор if не работает

пример (не работает)

{% set project = '/home/project_name' %}
 {% if salt['cmd.run']('ls -lt {{ project }}') | wc -l') == 2 %}
       <STATE>
 {% endif  %}

Мой код

{% set project = 'test_web_tool' %}

{% if salt['cmd.run']('ls -lt /home/project-user/project 2>/dev/null| wc -l') != "0" %}

output:
 cmd.run:
     - names:
       - echo "Rollback directory {{ project }}"
     - cwd: /root

{% else %}

error_output:
 cmd.run:
     - names:
       - echo "This is the last directory. Cant remove it"
    - cwd: /root

{% endif  %}

person user3323536    schedule 18.02.2014    source источник


Ответы (3)


Вероятно, вы захотите использовать ~ оператор для объединения двух строк:

{% set project = '/home/project_name' %}
{% if salt['cmd.run']('ls -lt ' ~ project ~ ' | wc -l') == 2 %}
    <STATE>
{% endif %}
person quanta    schedule 26.02.2014

Из документации jinja:

Важно знать, что фигурные скобки являются частью не переменной, а оператора печати. Если вы обращаетесь к переменным внутри тегов, не заключайте скобки.

Итак, чтобы ваш нерабочий пример работал, вам нужно удалить фигурную скобку, как показано ниже:

{% set project = '/home/project_name' %}
{% if salt['cmd.run']('ls -lt project') | wc -l') == 2 %}
       <STATE>
{% endif  %}
person Jason Zhu    schedule 18.02.2014
comment
Это звучит как проблема позже в вашем файле шаблона соли. Можете ли вы опубликовать все это? - person Jason Zhu; 19.02.2014
comment
Извините, но это не работает, оно всегда возвращает true :( может быть, есть инструмент отладки, чтобы увидеть, что происходит не так? - person user3323536; 19.02.2014
comment
К сожалению, неспособность увидеть, как будет интерпретироваться jinja, является одной из болевых точек при использовании salt-stack прямо сейчас. Я думаю, проблема в том, что мы думаем, что jinja работает как bash, когда это не так. Не могли бы вы увидеть для этого чистое решение на Python или оно должно быть в jinja? - person Jason Zhu; 19.02.2014

Во-первых, ваш фрагмент кода неверен из-за того, что вы не позаботились об одном апострофе. Заметьте, у вас на одного меньше.

{% set project = '/home/project_name' %}
{% if salt['cmd.run']('ls -lt {{ project }}') | wc -l') == 2 %}
   <STATE>
{% endif  %}

Это правильная версия с точки зрения единственного апострофа:

{% set project = '/home/project_name' %}
{% if salt['cmd.run']('ls -lt {{ project }}) | wc -l') == 2 %}
   <STATE>
{% endif  %}

Во-вторых, соедините значение переменной с командой, используя оператор ~, который объединяет две строки.

Вот что я нашел об операторе ~ в документации Jinja 2 2.7.2:

~
Converts all operands into strings and concatenates them. {{ "Hello " ~ name ~ "!" }} 
would return (assuming name is 'John') Hello John!.

Итак, вот окончательная правильная версия:

{% set project = '/home/project_name' %}
{% if salt['cmd.run']('ls -lt' ~ project ~ ') | wc -l') == 2 %}
   <STATE>
{% endif  %}
person nmadhok    schedule 24.04.2014