使用jinja2生成配置文件

来源:互联网 发布:海贼王888 知乎 编辑:程序博客网 时间:2024/05/22 08:08

经常会遇到开新服的时候需要修改好多配置文件的情况,刚开始做运维的时候只知道傻傻地手动修改,很痛苦不说还经常会出错误。后来学Django的时候就想到,要是像模板生成页面一样生成配置文件不就好了么,于是我找到了jinja 。
这里使用了jinja2最基本的功能,将配置文件中要修改的部分用“{{ var_name }}”这种形式替换掉,再把var_name和值统一写到ini/yml/json等格式的配置文件中,运行脚本就可以一次渲染生成n个配置文件

jinja2的python api参考 jinjia2官网

安装jinja2:

pip install jinja2

渲染配置文件模板的Python脚本(render_tpl.py):

#! /usr/bin/python# -*- coding: utf-8 -*-from jinja2 import Environment, FileSystemLoaderimport ConfigParserimport os, sysreload(sys)sys.setdefaultencoding('utf-8')tamplate_dir = './tpl'output_dir = './output/'config_file = "server_config.ini"#判断文件夹是否存在,不存在则创建def chk_mkdir(dirname):    if not os.path.isdir(dirname):        os.makedirs(dirname)#从ini文件中读取配置def load_config(server_name):    cf = ConfigParser.ConfigParser()    cf.read(config_file)    values = cf.items(server_name)    return values#用jinja渲染模板生成最终配置文件的主函数def render_to_file(server_name):    env = Environment(loader = FileSystemLoader(tamplate_dir))    tpl_list = os.listdir(tamplate_dir)    # 渲染tpl目录下的所有模板    for t in tpl_list:        tpl = env.get_template(t)        info = load_config(server_name)        output = tpl.render(info)        with open(output_dir + t, 'w') as out:            out.write(output)if __name__ == "__main__":    server_name = sys.argv[1]    chk_mkdir(output_dir)    render_to_file(server_name)

下面以Django的settings.py配置文件的生成为例介绍使用方法:

server_config.ini 内容类似于下面:

[Server3]mysql_ip = 192.168.1.20mysql_db_name = 'db_test'msyql_user = 'test'mysql_pwd = 'test'

配置文件的模版放在./tpl目录中,内容类似于下面:

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': {{ mysql_db_name }},        'USER': {{ msyql_user }},        'PASSWORD': {{ mysql_pwd }},        'HOST': '{{ mysql_ip }}',        'PORT': '3306',    }}

运行./render_tpl.py Server3,会在当前目录下生成一个output目录,里面渲染好的配置文件内容如下:

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': "db_test",        'USER': "test",        'PASSWORD': "test",        'HOST': '192.168.1.20',        'PORT': '3306',    }}
0 0