目前来看,Python+yaml+Jinja2是非常方便生成批量配置的组合,在运维工作中用于批量生成设备的基础配置。
这里我的案例是配置一批交换机,基础配置不同的地方有:loopback地址(IPV4和IPV6),设备名称,ISIS网络号,至于其他互联地址什么的因为情况比较复杂,还是手工做吧。
那么思路就有了。
1、生成yaml文件,类似于下面结构:
- hostname: ar01.xxx.lon
v4_loopback: xx.xxx.xx.1
v6_loopback: aabb:ccdd::1
type: NE05E-SQ
net: 49.0001.xxxx.xxxx.xxxx.00
这里说明一下,loopback地址的V4网段是先规划好的,V6地址和ISIS网络号通过一定规则根据V4地址生成,这个yaml文件可以通过读取excel文件,按照算法生成yaml文件,这个在其他文章里再写。
2、读取yaml文件,生成一个由字典组成的列表。每个字典的信息就包含了每台设备需要的变量。
3、写一个函数,遍历列表里的字典,每读取一个字典,把其中变量取出来放进一个临时字典,渲染jinja2的模板,对每个字典输出不同的配置文件。这个临时字典每读取一次就清空,重新写入变量。
有一些细节比如文档取名,时间函数等要调用一些模块,总结一下涉及的知识点,有:yaml模块,jinja2模块,os模块,日期函数,条件循环,I/O操作。
附上python脚本:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import yaml
import datetime
from jinja2 import Environment, FileSystemLoader
def DatetimeToDate():
timeStruct = datetime.date.today()
return timeStruct.strftime('%Y-%m-%d')
yamlFileName = 'metro-ax.yaml'
curPath = os.path.dirname(os.path.realpath(yamlFileName))
yamlPath = os.path.join(curPath, yamlFileName)
f = open(yamlPath, 'r', encoding='utf-8')
yamlFileDict = yaml.load(f)
yamlFileLen = (len(yamlFileDict))
templateFileName = 'ne05e-sq-node.tmpl'
env = Environment(
loader=FileSystemLoader('templates'), trim_blocks=True, lstrip_blocks=True)
template = env.get_template(templateFileName)
def main():
for seq in range(0, (yamlFileLen)):
readYamlbyLine = {}
readYamlbyLine.update({"hostname": yamlFileDict[seq]["hostname"]})
readYamlbyLine.update({"v4_loopback": yamlFileDict[seq]["v4_loopback"]})
readYamlbyLine.update({
"v6_loopback": yamlFileDict[seq]["v6_loopback"]
})
readYamlbyLine.update({"net": yamlFileDict[seq]["net"]})
filename = 'output/' + readYamlbyLine[
'hostname'] + "_" + DatetimeToDate() + "_" + 'conf'
print('Create file: ', filename)
output = template.render(readYamlbyLine)
with open(filename, "a") as f:
f.write(output)
f.write('\n')
if __name__ == "__main__":
main()
模板文件放在‘templates’目录下,否则会报错找不到文件。
python新手,有不合理的地方请高手指点。