Jinja 是啥?
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用, 并且提供了可选的沙箱模板执行环境保证安全:
<title>\{\% block title \%\}\{\% endblock \%\}</title>
<ul>
\{\% for user in users \%\}
  <li><a href="">\{\{ user.username \}\}</a></li>
\{\% endfor \%\}
</ul>
特性
- 沙箱中执行
- 强大的 HTML 自动转义系统保护系统免受 XSS
- 模板继承
- 及时编译最优的 python 代码
- 可选提前编译模板的时间
- 易于调试。异常的行数直接指向模板中的对应行。
- 可配置的语法
使用
SaltStack 是使用 YAML 语言来将 SLS 文件解释成它自己可以识别的内容。默认的模板引擎是 Jinja。
条件
\{\% if grains['os_family'] == 'RedHat' \%\}
apache: httpd
git: git
\{\% elif grains['os_family'] == 'Debian' \%\}
apache: apache2
git: git-core
\{\% endif \%\}
循环
\{\% for DIR in ['/dir1','/dir2','/dir3'] \%\}
\{\{ DIR \}\}:
  file.directory:
    - user: root
    - group: root
    - mode: 774
\{\% endfor \%\}
执行模块
比如当我们需要对多台服务器做一些 Apache 服务配置时,由于每台服务器信息不一样(比如 IP 不同), 如果为每台服务器去创建 SLS 文件就不太合理,而通过 Jinja 模板则可以用生成变量→读取变量的方式来为每个服务器设置应有的信息。
apache-service:
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://files/httpd.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja                       #增加这行表示开启模板
    - defaults:                             #下面设定变量的值
      HOST: \{\{ grains['fqdn_ip4'][0] \}\}     #[fqdn_ip4]代表的是IP,由于grains查询输出的是列表,会有多个值,需要加上[0]代表取第一个值
      PORT: 8181                            #监听的端口
  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - watch:
      -file: apache-service
import
\{\% from 'config.sls' import map \%\}
#=====================================================
\{\% set nn = 'this is nn' \%\}
\{\% import 'params.sls' as params with context \%\}
# with context的意思是config可以引用上下文中的变量,nn可以在params.sls被使用
#cc的值是this is nn
#=====================================================
\{\% from 'config.sls' import map with context \%\} 
#=====================================================
#config.sls
\{\% set map = salt['grains.filter_by']({
    'Debian': {
        'pkgs': ['bind9', 'bind9utils', 'dnssec-tools'],
        'service': 'bind9',
        'config_source_dir': 'bind/files/debian'
    },
    'RedHat': {
        'pkgs': ['bind'],
        'service': 'named',
        'config_source_dir': 'bind/files/redhat'
    })
\%\}
#=====================================================
#params.sls
\{\% set aa = 'aa'\%\}
\{\% set bb = 'aa'\%\}
\{\% set cc = nn \%\}
