python模板渲染配置文件
2014-10-21 17:01
375 查看
python的mako、jinja2模板库,确实好用!这里做个笔记,好记性不如烂笔头。
解析配置文件,返回值是一个dict
'''
这个函数实现的功能
举例来说,掩码前缀为27转换为255.255.255.224
'''
'''
根据网关地址和掩码前缀得到管理网网段
'''
'''
利用python模板库渲染配置文件
'''
针对上面代码的改良版,写的不好的地方,欢迎大家指出!
参考链接
http://www.yeolar.com/note/2012/08/26/mako-usage/
/article/1651987.html
本文出自 “the-way-to-cloud” 博客,请务必保留此出处http://iceyao.blog.51cto.com/9426658/1566384
#!/usr/bin/env python #encoding=utf-8 import sys,yaml # 配置文件使用yaml格式 from mako.template import Template # 加载mako库的Template Class from jinja2 import Environment,FileSystemLoader # 加载jinja2的Environment,FileSystemLoader Class'''
解析配置文件,返回值是一个dict
'''
def parse_pxe_config(filename): config = yaml.load(file(filename,'r')) return config'''
这个函数实现的功能
举例来说,掩码前缀为27转换为255.255.255.224
'''
def int2mask(mask_str): mask_int = int(mask_str) mask_array = ['0' for i in xrange(32)] # python for循环,吊吧!一口气生成32个list的元素 for i in xrange(mask_int): mask_array[i] = '1' temp_mask = [''.join(mask_array[i*8:(i+1)*8]) for i in xrange(4)] # 每8位组成一个list元素 temp_mask = [str(int(i,2)) for i in temp_mask] # int(i,2) 二进制转换为十进制 return '.'.join(temp_mask)
'''
根据网关地址和掩码前缀得到管理网网段
'''
def get_manage_net(gateway,prefix_str): prefix = int(prefix_str) int2bin = [bin(int(i,10)).split('0b')[1] for i in gateway.split('.')] # bin(int(i,10)) 十进制转化为二进制 for i in xrange(4): if len(int2bin[i]) < 8: int2bin[i] = '0'*(8 - len(int2bin[i])) + int2bin[i] int2bin = ''.join(int2bin) int2bin = int2bin[0:prefix]+'0'*(32-prefix) int2bin_list = [int2bin[8*i:(i+1)*8] for i in xrange(4)] manage_net = [str(int(i,2)) for i in int2bin_list] return '.'.join(manage_net)
'''
利用python模板库渲染配置文件
'''
def create_pxe_config(config): # 读取配置文件中的配置项 system_common = config['system common'] manage_prefix = system_common['manage_prefix'] manage_gateway = system_common['manage_gateway'] manage_mask = int2mask(manage_prefix) manage_net = get_manage_net(manage_gateway,manage_prefix) dns = system_common['dns'] fqdn = system_common['fqdn'] repo_url = system_common['repo_url'] password = system_common['password'] manage_nic = system_common['manage_nic'] storage_nic = system_common['storage_nic'] public_nic = system_common['public_nic'] data_nic = system_common['data_nic'] deploy_node = config['deploy node'] deploy_node_ip = deploy_node['ip'] deploy_node_hostname = deploy_node['hostname'] dhcp_range_start = deploy_node['dhcp_range_start'] dhcp_range_end = deploy_node['dhcp_range_end'] compute_node = config['compute node'] dhcp_template = Template( # 创建一个Template对象 filename='./pxe_template/dhcpd.conf', module_directory='/tmp/mako_modules' # 为了提高性能,从文件加载的 Template 还可以在文件系统中将生成的模块缓存为一般的Python模块文件, ) # 下次同样参数的Template 创建时,自动重用/tmp/mako_modules/目录下的模块文件。 dhcp_content = dhcp_template.render( # 传给 Template 的文本参数被编译为一个Python模块。模块包含一个 render_body() 函数,它产生模板的输出。 manage_gateway = manage_gateway, # 调用render() 方法时,Mako建立了一个模板的运行环境,并调用 render_body() 函数,把输出保存到缓冲,返回它的字符串内容 dns = dns, manage_mask = manage_mask, fqdn = fqdn, deploy_node_ip = deploy_node_ip, manage_net = manage_net, dhcp_range_start = dhcp_range_start, dhcp_range_end = dhcp_range_end ) fp = open('./pxe_config/dhcpd.conf','w') # 生成dhcpd.conf配置文件 fp.write(dhcp_content) if fp != None: fp.close() ip_mac_template = Template( # ip-mac 绑定 filename='./pxe_template/ip_mac.conf', module_directory='/tmp/mako_modules' ) for compute in compute_node: ip_mac_content = ip_mac_template.render( compute_hostname = compute['hostname'], manage_mac = compute['manage_mac'], manage_ip = compute['manage_ip'] ) fp = open('./pxe_config/dhcpd.conf','a') # 以append方式打开文件 fp.write('\n'+ip_mac_content) # 追加内容 env = Environment( loader = FileSystemLoader('./pxe_template') # 这个类的实例被用于存储配置信息, 全局对象, 从文件系统或其他位置加载模板,使用的加载器loader是FileSystemLoader类型, ) # 可以加载的模板是当前工作目录下的templates目录下的模板文件 ks_template = env.get_template("puppet.cfg") # 使用env的模板环境加载名为puppet.cfg的模板文件. ks_content = ks_template.render( # 渲染模板template repo_url = repo_url, password = password, deploy_node_hostname = deploy_node_hostname, fqdn = fqdn, deploy_node_ip = deploy_node_ip, public_nic = public_nic, storage_nic = storage_nic, data_nic = data_nic, manage_gateway = manage_gateway, manage_mask = manage_mask ) fp = file('./pxe_config/puppet.cfg','w') fp.write(ks_content) if fp != None: fp.close()
if __name__ == '__main__': if len(sys.argv) != 2 or sys.argv[1] != 'config.yaml': print "Usage:pxe-init.py config.yaml" sys.exit(-1) config = parse_pxe_config(sys.argv[1]) create_pxe_config(config)
针对上面代码的改良版,写的不好的地方,欢迎大家指出!
#!/usr/bin/env python
#encoding=utf-8
import sys,yaml
import subprocess # 用来创建一个子进程
from jinja2 import Environment,FileSystemLoader # 统一使用jinja2模板
env = Environment(
loader = FileSystemLoader('./pxe_template') # env设为全局变量
)
def parse_pxe_config(filename): config = yaml.load(file(filename,'r')) return config
'''
'1'*4 == '1111'
int('111',2) == 7 二进制转换十进制
从<<运算符得出的灵感
'''
def int2mask(prefix):
return '.'.join(str(int(('1'*(int(prefix))+'0' \
*(32-int(prefix)))[i*8:(i+1)*8],2)) \
for i in xrange(4))
'''
使用zip对两个list同时遍历,然后对各个元素进行&运算
192 168 2 254
255 255 255 224
不知道通过ip和mask计算网络号,google下!
'''
def get_manage_net(gateway,prefix_str):
mask = int2mask(int(prefix_str))
return '.'.join(str(int(m) & int(n)) \
for m,n in zip(gateway.split('.'),mask.split('.')))
'''
模板渲染抽象为一个函数
渲染的时候可以传进一个dict搞定,dict的key要和模板中的变量名对应(我老大实验得到的)
'''
def create_config_template(tem_name,tem_dict):
template = env.get_template(tem_name)
content = template.render(tem_dict)
return content
'''
创建配置文件
'''
def create_config_file(config_name,content,mode):
try:
fp = open(config_name,mode)
fp.write(content+'\n')
except IOError:
print "Error: can\'t find file or read data"
else:
fp.close()
'''
这部分内容比上面的搜身了不少吧,当然还有很多地方要改进的!
'''
def create_pxe_config(config):
system_common = config.get('system common') # 字典使用get方法获取key对应的value,如果key不存在,返回None。比config['system common']友好多了。
manage_prefix = system_common.get('manage_prefix')
manage_gateway = system_common.get('manage_gateway')
manage_mask = int2mask(manage_prefix)
manage_net = get_manage_net(manage_gateway,manage_prefix)
deploy_node = config.get('deploy node')
deploy_node['manage_gateway'] = manage_gateway
deploy_node['manage_mask'] = manage_mask
deploy_node['manage_net'] = manage_net
dhcp_content = create_config_template('dhcpd.conf',deploy_node)
create_config_file('./pxe_config/dhcpd.conf',dhcp_content,'w')
compute_node = config['compute node']
for compute_name,compute_info in compute_node.items():
ip_mac_content = create_config_template("ip_mac.conf",compute_info)
create_config_file('./pxe_config/dhcpd.conf',ip_mac_content,'a')
subprocess.Popen('service dhcpd restart',shell = True) # 开了子进程来重启dhcpd服务,好让修改的dhcp配置生效
deploy_node.update(system_common)
ks_content = create_config_template('puppet.cfg',deploy_node)
create_config_file('./pxe_config/puppet.cfg',ks_content,'w')
pxe_default_content = create_config_template('default',system_common)
create_config_file('./pxe_config/default',pxe_default_content,'w')
'''
这部分不变
'''
if __name__ == '__main__': if len(sys.argv) != 2 or sys.argv[1] != 'config.yaml': print "Usage:pxe-init.py config.yaml" sys.exit(-1) config = parse_pxe_config(sys.argv[1]) create_pxe_config(config)
参考链接
http://www.yeolar.com/note/2012/08/26/mako-usage/
/article/1651987.html
本文出自 “the-way-to-cloud” 博客,请务必保留此出处http://iceyao.blog.51cto.com/9426658/1566384
相关文章推荐
- python 利用模板文件生成配置文件
- 通过python生成nginx模板配置文件
- python模块之ConfigParser: 用python解析配置文件
- 使用python的ConfigParser模块方便的读取配置文件
- PYTHON 配置文件模块 ConfigParser
- ssh配置文件头模板
- 用python写的一个超小型配置文件读取器
- Python读取XML配置文件小例子
- python操作配置文件
- Hibernate配置文件模板(.cfg.xml)
- Python recipe(11):读取ini配置文件
- python 中对配置文件(如.ini文件)进行读写等操作ConfigParser模块
- PHP - Smarty模板引擎 - Manual手册 - Chapter 7. Built-in Functions第7章 内建函数 - {config_load}用于从一个配置文件加载配置变量到模板中
- python的配置文件app.yaml
- python 的配置文件模块
- Perl: 基本语法参考、配置文件、模板、正则表达式
- Mod_python 访问时不访问特定py文件的配置方法
- hibernate 配置文件(hibernate.properties)基本模板
- ant配置文件标准模板(转载)
- WCF配置文件模板