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.pswp.cn/news/394263.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394263.shtml
英文地址,請注明出處:http://en.pswp.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;邁克爾堅信兄長是無辜的。林肯的死刑執行…