经常会遇到开新服的时候需要修改好多配置文件的情况,刚开始做运维的时候只知道傻傻地手动修改,很痛苦不说还经常会出错误。后来学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, FileSystemLoader
import ConfigParser
import os, sys
reload(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.20
mysql_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',
}
}