这是来自 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 的“用户的家”的模板,但渲染模板时用户可能不存在,因此其主目录可能不存在。
虽然第一个版本可以工作,但它非常丑陋,并且难以阅读。
有没有办法让这个不那么神秘?
这不是盐中Jinja模板中的代码块的重复,因为在这种情况下不能使用字典查找。 (例如,代码是任意的。)
不,您提供的第一个示例代码正是 Jinja 的工作方式。