这是来自 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 模板中的代码块的重复,因为在这种情况下不能使用字典查找。例如。代码是任意的。
不,您提供的第一个示例代码正是 Jinja 的工作方式。
您可以使用的一种替代语法是 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
提供的。
jinja_env
和 jinja_sls_env
键下进行配置。jinja_sls_env:
line_statement_prefix: '%'
line_comment_prefix: '#'
#jinja2:line_statement_prefix: '%', line_comment_prefix: '#'
% set user = 'my_user'
# ...
from jinja2 import Environment, PackageLoader, select_autoescape
env = Environment(
loader=PackageLoader("yourapp"),
line_statement_prefix='%',
line_comment_prefix='#'
)