python的mako、jinja2模板库,确实好用!这里做个笔记,好记性不如烂笔头。

#!/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])

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)

参考链接

python渲染光线_python模板渲染配置文件相关推荐

  1. php 模板渲染,ThinkPHP6.0模板渲染 - ThinkPHP6.0快速开发手册(案例版) - php中文网手册...

    模板渲染生成页面 模板渲染, 其实就是生成前端页面 模板路径 默认情况下,框架会自动定位你的模板文件路径,优先定位应用目录下的view目录,这种方式的视图目录下就是应用的控制器目录. 单应用模式 ├─ ...

  2. flask mysql项目模板渲染_Flask框架模板渲染操作简单示例

    本文实例讲述了Flask框架模板渲染操作.分享给大家供大家参考,具体如下: from flask import render_template from flask import Flask from ...

  3. python渲染光线_Python光线追踪

    我正在用纯Python构建一个简单的Python光线追踪器(仅仅是为了它),但我遇到了障碍. 我的场景的设置目前是这样的: 相机位于沿Y轴指向的0, -10, 0. 半径为1的球体位于0, 0, 0. ...

  4. mysql 动态hash_python动态渲染库_python 动态渲染 mysql 配置文件的示例

    背景 前段时间写了一个自动化安装 MySQL 的程序,其中有一个环节就是动态的渲染 my.cnf 文件:总的解决方案就是像 Django 渲染 html 页面一样,用渲染模板的方式来解决. [mysq ...

  5. Django——2 路由分配设置 re_path正则匹配 include总路由 url传参 name使用 模板渲染render方法 模板渲染方法...

    Django 路由分配设置 re_path正则匹配 include总路由设置 url额外参数的传递 name的使用 模板的渲染:render方法   路由的分配中, 可以设定相应的转换器加以约束,比如 ...

  6. python template模块_Python模板库Mako的用法

    Mako是一个高性能的Python模板库,它的语法和API借鉴了很多其他的模板库,如Django.Jinja2等等. 基本用法 创建模板并渲染它的最基本的方法是使用 Template 类: from  ...

  7. python configparser 数组_python读取ini配置文件,python中数组如何表示

    python读取ini配置文件 Python必须使用configparser包来读取ini配置,因此首先加载它. 导入configparser后,我们需要加载配置文件. config=configpa ...

  8. Django学习笔记之模板渲染、模板语言、simple_tag、母版子版、静态配置文件

    一.首先我们用PyCharm来创建一个Django项目 终端命令:django-admin startproject sitename 图形创建: 这样一个Django项目就创建完成了,上面可以看到项 ...

  9. python 3d渲染_python渲染_python 渲染_python三维渲染 - 云+社区 - 腾讯云

    广告关闭 回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你! 我正在为python寻找易于使用的3d场景渲染器. 我正在寻找的是能够: 加 ...

最新文章

  1. 怎样写出一个较好的高速排序程序
  2. 解决 ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
  3. html javascript 引号
  4. Java工程中使用Log4j小记
  5. erdas叠加显示_ERDAS操作技巧
  6. 【Nginx那些事】nginx配置实例(二)负载均衡
  7. 常用的sql语句用法
  8. 微软推出免费虚拟太空望远镜软件WWT
  9. 怎么用spss做冗余分析_【攻略】手把手教你怎么用SPSS做统计分析
  10. 抽奖活动mysql表设计_抽奖项目的系统设计方案
  11. Linux终端快捷键
  12. 【Python学习笔记】复习sql主键外键索引
  13. 动态与静态二维码生成器
  14. python 青少年人工智能_青少年人工智能教育的典范 优必学教孩子用Python编写一部人工智能的字典...
  15. linux 命令:less详解
  16. lan口和wan口的配置
  17. UVA140回溯法剪枝剪多少的讨论
  18. Highcharts中文帮助文档
  19. 好听的计算机软件名称,好听的组合名字大全
  20. 利用三轴加速度求解位移的算法—来自飞思卡尔方案

热门文章

  1. Unity C# namespace 命名空间的使用
  2. (转)javascript匿名函数
  3. java.net.SocketException: Software caused connection abort: socket write erro
  4. Oracle宣布新的Java Champions
  5. javascript消除字符串两边空格的两种方式,面向对象和函数式编程。python oop在调用时候的优点...
  6. [Object-C语言随笔之三] 类的创建和实例化以及函数的添加和调用!
  7. openssl创建私有ca
  8. Linux设置RSA密钥登录
  9. Ubuntu 12.04 修改/etc/resolv.conf重启后还原成修改前状态解决办法
  10. leetcode1177. 构建回文串检测(前缀和)