2019-05-30 Python+Jinja2+yaml 批量生成配置

目前来看,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新手,有不合理的地方请高手指点。

你可能感兴趣的:(2019-05-30 Python+Jinja2+yaml 批量生成配置)