在工作中经常需要用到模版,使用参数来动态生成文件,例如:我们在k8s中,一些相似的deployment ,service ,我就使用yaml定义简单的属性,再定义两个deployment和service的模版,然后使用yaml库读取yaml定义的属性再使用jinjia2动态生成各个应用的部署模版。
1. 安装
pip install Jinja2
2. 简单使用
from jinja2 import Template
tpl = Template('my name is : {{ name }}')
text = tpl.render(name='jack')
print text
运行后:
$ python ./jinjia2-simple.py
my name is : jack
3. 使用说明:
1.配置模板文件搜索路径
TemplateLoader = jinja2.FileSystemLoader(searchpath=’/xxx’)
2.创建环境变量
TemplateEnv = jinja2.Environment(loader=TemplateLoader)
3.加载模板,渲染数据
template = TemplateEnv.get_template(template_name)
html = template.render(**kw)
4. 读取yaml文件,并使用模版,生成文件:
4.1 定义yaml文件(etc/userInfo.yaml)
username: zxx
age: 18
orther :
height: "175CM"
weitht: "107KG"
JobHistory:
- name : "IBM"
date : "2015-2017"
- name : "GA"
date : "2017-now"
4.2 定义模版文件(templates/config.tpl)
username: {{ username }}
age: {{ age }}
other.height: {{ other['height'] }}
other.height: {{ other['weight'] }}
JobHistory:
{% for key in JobHistory %}
name: {{ key }} ,
value: "{{ JobHistory[key] }}"
{% endfor %}
4.3 编写执行文件(test.py):
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from jinja2 import Environment, FileSystemLoader
import os
import yaml
import codecs
def generatefile(srcfile,tplpath,tplfile):
#Load data from YAML into Python dictionary
config_data = yaml.load(open(srcfile))
#Load Jinja2 template
env = Environment(loader = FileSystemLoader(tplpath), trim_blocks=True, lstrip_blocks=True)
template = env.get_template(tplfile)
#Render the template with data and print the output
return template.render(config_data)
content = generatefile('./etc/userInfo.yaml','./templates','config.tpl')
print content
4.4 运行结果:
$ ./test.py
username: zxx
age: 18
other.height: 175CM
other.height:
JobHistory:
name: {'date': '2015-2017', 'name': 'IBM'} ,
value: ""
name: {'date': '2017-now', 'name': 'GA'} ,
value: ""
参考:
http://jinja.pocoo.org/docs/dev/