在同一个 Jinja 块中使用多个语句 {% ... %}

问题描述 投票:0回答:2

这是来自 SLS(盐堆栈)文件的示例代码,使用 Jinja:

{% set here = 'some-value' -%}
{%- set user = 'my_user' -%}
{%- set group = 'my_group' -%}

{%- set all_users = salt['user.list_users']() -%}
{%- if user in all_users -%}
{%- set usr_home = salt['user.info'](user).home -%}
{%- set prefix = 'some_prefix' ~ '_' ~ user %}

# This is just an example state
{{ prefix }}-dotvnc:
  file.directory:
    - name: {{ usr_home }}/.vnc
    - user: {{ user }}
    - group: {{ group }}
    - mode: '0700'

{% endif -%}

这看起来很丑,我想做这样的事情:

{% 
set here = 'some-value'
set user = 'my_user'
set group = 'my_group'

set all_users = salt['user.list_users']()
if user in all_users
  set usr_home = salt['user.info'](user).home
  set prefix = 'some_prefix' ~ '_' ~ user
%}

# This is just an example state
{{ prefix }}-dotvnc:
  file.directory:
    - name: {{ usr_home }}/.vnc
    - user: {{ user }}
    - group: {{ group }}
    - mode: '0700'

{% endif -%}

无法避免多个变量和命令,此示例显示了一个使用 Jinja 用户的主目录的模板,但是,渲染模板时该用户可能不存在,因此其主目录可能不存在。

虽然第一个版本可以工作,但它非常丑陋,并且难以阅读。

有没有办法让这个不那么神秘?

不是salt中 Jinja 模板中的代码块的重复,因为在这种情况下不能使用字典查找。例如。代码是任意的。

jinja2 salt-stack
2个回答
1
投票

不,您提供的第一个示例代码正是 Jinja 的工作方式。


0
投票

您可以使用的一种替代语法是 line 语句 - 但如果它不太神秘,当然,这取决于您的喜好。

有了它,你的模板可能看起来像这样:

% set user = 'my_user'
% set group = 'my_group'

% set all_users = salt['user.list_users']()
% if user in all_users
  % set usr_home = salt['user.info'](user).home
  % set prefix = 'some_prefix' ~ '_' ~ user

# This is just an example state
{{ prefix }}-dotvnc:
  file.directory:
    - name: {{ usr_home }}/.vnc
    - user: {{ user }}
    - group: {{ group }}
    - mode: '0700'
% endif

这种可能性是通过参数

line_statement_prefix
line_comment_prefix
提供的。

  • 在 SaltStack 中,可以在 Salt 配置文件中的
    jinja_env
    jinja_sls_env
    键下进行配置。
    例如。:
    jinja_sls_env:
      line_statement_prefix: '%'
      line_comment_prefix: '#'
    
  • 在 Ansible 模板中,这可以作为模板的第一行传递:
    #jinja2:line_statement_prefix: '%', line_comment_prefix: '#'
    % set user = 'my_user'
    # ...
    
  • 在纯 Jinja 项目中,这将通过在 环境初始化时设置的参数进行配置。
    from jinja2 import Environment, PackageLoader, select_autoescape
    env = Environment(
        loader=PackageLoader("yourapp"),
        line_statement_prefix='%', 
        line_comment_prefix='#'
    )
    
© www.soinside.com 2019 - 2024. All rights reserved.