saltstack之jinja

saltstack学习之十八

Posted by Jht on December 6, 2017

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 \%\}

参考文档

Jinja 文档

UNDERSTANDING JINJA

Saltstack Jinja