python渲染光线_python模板渲染配置文件

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)

参考链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode114. 二叉树展开为链表(深度优先搜索)

给定一个二叉树&#xff0c;原地将它展开为一个单链表。例如&#xff0c;给定二叉树1/ \2 5/ \ \ 3 4 6 将其展开为&#xff1a;1\2\3\4\5\6代码 class Solution {public void flatten(TreeNode root) {flat(root);}public TreeNode flat(TreeNode root) {if(rootnull)…

eclipse新建web项目

需要点击File—>New—>Other…在Web文件夹下找到Dynamic Web Project—>Next修改server端口可以在启动项目后访问地址是端口号项目名转载于:https://juejin.im/post/5cb4999df265da037b610545

idea tips

AltInsert 自动出现generate ,,里面有构造方法&#xff0c;getter,setter... CtrlO,重写方法 CtrlI...自动出现接口的方法 转载于:https://www.cnblogs.com/bin-lin/p/6247538.html

革新以太网交换机架构 全光网络的风刮进园区

全光网络的风正在刮进园区网&#xff0c;众所周知&#xff0c;光纤入户发展迅速&#xff0c;随着PON&#xff08;无源光纤网络&#xff09;技术在运营商通信网络的大规模使用&#xff0c;PON相关产业链逐步成熟&#xff0c;这也使得PON技术逐步在企业园区网得到应用。 基于铜线…

mysql loop循环实例_MySql CURSOR+LOOP循环-使用小实例

转载自https://blog.csdn.net/starinbrook/article/details/77078126转载自https://blog.csdn.net/makang456/article/details/53896346/【简介】游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行&am…

react数据从本地读取_如何将从Google表格读取的React应用程序部署到Netlify

react数据从本地读取In this tutorial, we’re going to cover how to connect to a spreadsheet hosted on Google, display that information inside a React application, and deploy it to Netlify.在本教程中&#xff0c;我们将介绍如何连接到Google托管的电子表格&#x…

leetcode743. 网络延迟时间(迪杰斯特拉算法)

有 N 个网络节点&#xff0c;标记为 1 到 N。 给定一个列表 times&#xff0c;表示信号经过有向边的传递时间。 times[i] (u, v, w)&#xff0c;其中 u 是源节点&#xff0c;v 是目标节点&#xff0c; w 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;我们从某个…

在线python视频教程_【好程序员】2019 Python全套视频教程2

2019千锋好程序员全新Python教程&#xff0c;深入浅出的讲解Python语言的基础语法&#xff0c;注重基本编程能力训练&#xff0c;深入解析面向对象思想&#xff0c;数据类型和变量、运算符、流程控制、函数、面向对象、模块和包、生成器和迭代器。教程列表&#xff1a;千锋Pyth…

洛谷——P1546 最短网络 Agri-Net

P1546 最短网络 Agri-Net 题目背景 农民约翰被选为他们镇的镇长&#xff01;他其中一个竞选承诺就是在镇上建立起互联网&#xff0c;并连接到所有的农场。当然&#xff0c;他需要你的帮助。 题目描述 约翰已经给他的农场安排了一条高速的网络线路&#xff0c;他想把这条线路共享…

漫谈单点登录(SSO)(淘宝天猫)(转载)

1. 摘要 &#xff08; 注意&#xff1a;请仔细看下摘要&#xff0c;留心此文是否是您的菜&#xff0c;若浪费宝贵时间&#xff0c;深感歉意&#xff01;&#xff01;&#xff01;&#xff09; SSO这一概念由来已久&#xff0c;网络上对应不同场景的成熟SSO解决方案比比皆是&…

mysql mdl 锁_MySQL MDL锁

MDL全称为metadata lock&#xff0c;即元数据锁。MDL锁主要作用是维护表元数据的数据一致性&#xff0c;在表上有活动事务(显式或隐式)的时候&#xff0c;不可以对元数据进行写入操作。因此从MySQL5.5版本开始引入了MDL锁&#xff0c;来保护表的元数据信息&#xff0c;用于解决…

Card Game Again CodeForces - 818E (双指针)

大意: 给定序列, 求多少个区间积被k整除. 整除信息满足单调性, 显然双指针. 具体实现只需要考虑k的素数向量, 对每一维维护个指针即可. 这题看了下cf其他人的做法, 发现可以直接暴力, 若当前的前缀积模k为0, 暴力向前求出第一个后缀积为0的位置即可, 复杂度是$O(n)$的并且相当好…

pacf和acf_如何通过Wordpress API,ACF和Express.js使Wordpress更加令人兴奋

pacf和acfby Tyler Jackson泰勒杰克逊(Tyler Jackson) 如何通过Wordpress API&#xff0c;ACF和Express.js使Wordpress更加令人兴奋 (How to make Wordpress more exciting with the Wordpress API, ACF, & Express.js) I’ve been working with Wordpress since it’s pr…

python运行出现数据错误_Python运行出错情况

1、错误内容&#xff1a;You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory str). It is highly recommended that you instead just switch your application to Unicode strings.错误描述&#x…

leetcode95. 不同的二叉搜索树 II(递归)

给定一个整数 n&#xff0c;生成所有由 1 ... n 为节点所组成的 二叉搜索树 。示例&#xff1a;输入&#xff1a;3 输出&#xff1a; [[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3] ] 解释&#xff1a; 以上的输出对应以下 5 种不同结构的二叉搜索树…

数据结构探险系列—栈篇-学习笔记

数据结构探险—栈篇 什么是栈&#xff1f; 古代栈就是牲口棚的意思。 栈是一种机制&#xff1a;后进先出 LIFO&#xff08;last in first out&#xff09; 电梯 栈要素空栈。栈底&#xff0c;栈顶。没有元素的时候&#xff0c;栈顶和栈底指向同一个元素&#xff0c;如果加入新元…

MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库

Mysql默认关闭远程登录权限&#xff0c;如下操作允许用户在任意地点登录&#xff1a;1. 进入mysql&#xff0c;GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY WITH GRANT OPTION;IDENTIFIED BY后跟的是密码&#xff0c;可设为空。2. FLUSH privileges; 更新Mysql为了安…

time series 时间序列 | fractional factorial design 部分要因试验设计

作业&#xff1a; 1) A plot of data from a time series, which shows a cyclical pattern – please show a time series plot and identify the length of the major cycle. 2) Data from a full factorial or fractional factorial experiment with at least 2 factors –…

如何在Go中编写防弹代码:不会失败的服务器工作流程

by Tal Kol通过塔尔科尔 如何在Go中编写防弹代码&#xff1a;不会失败的服务器工作流程 (How to write bulletproof code in Go: a workflow for servers that can’t fail) From time to time you may find yourself facing a daunting task: building a server that really …

越狱第一至五季/全集迅雷下载

越狱 第一季 Prison Break Season 1 (2005) 本季看点&#xff1a;迈克尔斯科菲尔德是一头陷于绝境欲拼死一搏的怒狮——他的哥哥林肯巴罗斯被认定犯有谋杀罪被投入了福克斯河监狱的死囚牢。虽然所有的证据都指出林肯就是凶手&#xff0c;迈克尔坚信兄长是无辜的。林肯的死刑执行…