我需要在状态文件中应用基于静态minion id的if-else逻辑。目标glob限定了一大堆服务器,但我需要在一台服务器上运行一小段逻辑,并在所有服务器上运行一堆常见的东西。我怎么能这样做?
当我把它放在Jinja文件中时,它的错误是:
- Rendering SLS 'base:bin.test' failed: Jinja syntax error: expected token 'as', got 'end of statement block'; line 1
-
- ---
- {% import salt.config %} <======================
- {% minion_opts = salt.config.minion_config('/etc/salt/minion') %}
- {% print(minion_opts['id']) %}
错误:
{{1}}
毫无疑问,我无论如何都不是Saltstack专家。
答案 0 :(得分:0)
发生错误是因为您在unexpected way中使用了Jinja的import
。如果这是一个Flask应用程序,你应该在views.py路由中使用这样的东西来为模板提供变量:
render_template('my_template.html', salt=salt)
更正后的代码应如下所示:
{% set minion_opts = salt.config.minion_config('/etc/salt/minion') %}
{{ minion_opts['id'] }}
{% if minion_opts['id'] == 'xyz.server' %}
{{ 'logic goes here' }}
{% endif %}
请参阅Assignments docs,了解如何为变量赋值。
if
statement末尾不需要冒号,并且在完成条件语句后请记得使用{% endif %}
。
答案 1 :(得分:0)
首先,我意识到这是一个老问题,但是对于某些相关问题,它仍然显示在我对DDG和Google的搜索结果的顶部,并且当前的答案并没有真正提出,因此以下是基于最新的SaltStack版本(3002)的答案:
为了使控制流基于minion id为Jinja工作:
{% if salt['grains.get']('id') == 'minion_a' %}
some text to render for minion_a
{% else %}
some text to render otherwise
{% endif %}
我意识到问题的措辞以及所提供的示例代码还有其他问题,但是我的代码段回答了以下实际问题:
我需要基于状态文件中的静态minion id应用if-else逻辑。
我该怎么做?