前面我们说过,读取yaml文件,配合jinja2,使用python脚本批量生成配置文件(请参考2019-05-30 Python+Jinja2+yaml 批量生成配置)
那么,yaml文件要自己去写的话,未免也太累了。一般最初的信息,大都使用excel来存储。好在这点python也能帮上忙,读取excel文件,生成yaml格式的文件。
python可以读取各种格式的excel文件,这里我只说一下读取csv格式的。
思路是这样的:
1、读取excel文件,生成一个列表,列表由N个字典组成,其中key是读取第一行的,values是每一行的内容。
2、通过计算,更新每个字典的值,使其符合批量生成配置的yaml文件需求。这里我需要通过loopback的IPV4地址生成IPV6地址,以及生成ISIS网络号。如果仅仅是读取csv直接生成yaml,那就更简单了,这一步可以省略。
3、循环读取更新后的字典,追加到临时列表里。
4、生成yaml文件。
脚本如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 读取csv表格,生成字典
import csv
import os
from ruamel import yaml
#因为IPV6地址段已经确定,直接用seq变量,seq是编号,等于IPV4的地址最后一段,与其保持一致
def v6_loopback_from_node_no(seq):
return '2AB2:6B62::{}'.format(seq)
#同理,IPV4的网段是确定的,生成ISIS网络号只需搞定倒数第二段的4位即可,L0 IP地址的最后一段,:03d 表示右对齐宽度3位。
def net_from_ip(ip):
return '49.0001.xxxx.xxxx.6{:03d}.00'.format(int(ip.split('.')[3]))
curpath = os.path.dirname(os.path.realpath(__file__))
yamlpath = os.path.join(curpath, "ax-test.yaml")
with open("pops-test.csv",'r',encoding="utf-8") as f:
reader = csv.reader(f)
fieldnames = next(reader) # 获取数据的第一列,作为后续要转为字典的键名 生成器,使用next方法获取
# print(fieldnames)
csv_reader = csv.DictReader(f,fieldnames=fieldnames) #self._fieldnames = fieldnames # list of keys for the dict 以list的形式存放键名
dic_list = [] #临时列表
for row in csv_reader:
d={}
for k,v in row.items():
d[k]=v
d['seq'] = int(d['seq'])
d['v6_loopback'] = v6_loopback_from_node_no(d['seq'])
d['net'] = net_from_ip(d['v4_loopback'])
dic_list.append(d)
with open(yamlpath, "w", encoding="utf-8") as f:
yaml.dump(dic_list, f, Dumper=yaml.RoundTripDumper)
print("Yaml file created: ", yamlpath)
生成的yaml格式是这样的:
- hostname: ar01.xxx.lon
seq: 1
v4_loopback: xx.xxx.xx.1
v6_loopback: 2AB2:6B62::1
type: NE05E-SQ
net: 49.0001.xxxx.xxxx.6001.00
- hostname: ar01.xxx.lon
seq: 2
v4_loopback: xx.xxx.xx.2
v6_loopback: 2AB2:6B62::2
type: NE05E-SQ
net: 49.0001.xxxx.xxxx.6002.00
- hostname: ar01.xxx.lon
seq: 4
v4_loopback: xx.xxx.xx.4
v6_loopback: 2AB2:6B62::4
type: NE05E-SQ
net: 49.0001.xxxx.xxxx.6004.00
python新手,请高手指点。