用vscode打造网络配置模板管理系统
这个想法是源自China NetDevOps Club群里的一个人,本人在此基础上做了一些开发,方便大家快速生成自己的配置模板代码片段,进而在vscode中可以检索、快速调用指定的配置模板。基于配置模板可以对自己出配置可以非常好的进行指导,老师一直告诉我们好脑子不如烂笔头,当今时代的烂笔头可以是多样化的。同时最重要的,我觉得是出的配置有所约束,不再是天马行空拍脑袋想出来的了。
关于vscode
vscode是微软家的一款IDE,跨平台源代码编辑器,开源的。对于想写Python人来说,新手真正的IDE一般2种选择,vscode和pycharm。各有千秋,回头我也考虑分享下怎么使用这两款,以及对比。其中vscode非常轻量级,且支持的代码不只是Python,且对各类文本编辑都有非常好的支持。大家有兴趣可以去下载一个试试。
思路
vscode可以自定义用户代码片段,且全局生效。什么是用户代码片段呢。
比如以下代码片段
if __name__ == '__main__':
pass
我们在vscode里可能输入 main,vscode立刻检索我们录入的和系统自带的代码片段,每个代码片段都有一个名字,比如上面代码片段对应名字是__main__
我们可以任意挑选字符,vscode都会帮助我们自动筛选符合条件的代码片段。
什么意思呢,假如我有三个端口配置的代码片段,名字分别如下:
cisco_interface_config,hw_interface_config,cisco_vlan_config
我们输入c f的时候,所有包含字母cf的的代码片段会出现在右侧(但是如果名字过长,尽量输入比较靠前的字母会比较容易检索成功)
我们的第一个想法来了
将我们日常用的配置模板写成vscode(你也可以写其他ide)支持的用户代码片段格式即可。然后放入指定目录,比如我的目录是
C:\Users\Administrator\AppData\Roaming\Code\User\snippets
这样我们就可以在vscode中任意输入字符来检索我们的模板库,调取对应的模板。调出模板后再出我们的配置。
我们打开一个代码片段看看它长什么样子
这个代码片段描述了代码主体 body,代码片段的描述 description,以及如何通过前缀 也就是我们的输入访问它 cisco_ios_confg,我们只要输入这个前缀的相关信息就可以会自动检索出来。
有了众多的基于我们的配置模板的代码片段,我们专属的配置模板库就搭建成功了。
组织好自己的配置模板仓库
但是这个时候出现了两个问题:
一个是如何比较好的组织这个模板配置库(有效的组织,可以极大提高我们检索的效率)
另外一个就是如何快速的生成这个模板配置库(它可以通过图形界面手工导入,但是这个过程其实很繁琐,我们的配置模板如果特别多,就会非常非常的。。。)。
这两个问题我是这么解决的
- 配置模板的prefix遵循以下规则
{厂商}_{平台}_{配置名称}
。这样比较符合我们配置时候的思路,先选厂商再选平台最后是配置项,和ansible netmiko的思路基本一致 - 通过xlsx结合jinja2来大批量生成配置模板的代码片段。
我们写了一段代码,可以读取excel的表头如下
vendor | platform | name | template | description |
---|---|---|---|---|
cisco | nxos | vlan_config | interface {{端口名称}} description {{端口描述}} {{开关}} shutdown | 思科nxos端口配置,配置端口描述,起宕端口 |
利用jinja2结合表格生成自己的配置模板用户代码片段
然后用jinja2模板结合表格动态生成以上vscode识别的用户代码片段格式。
jinja2模板如下:
{
"config template": {
"prefix": "{{vendor}}_{{platform}}_{{name}}",
"body": [
{% for i in commands %}
"{{i}}",
{%endfor%}
],
"description": "{{description}}"
}
}
我们模板里用了commands,表头用了template,实际使用中需要将二者对应起来,需要将template按行切割。
非常简单的一个jinja2模板,没有学过jinja2模板引擎的可以 看看我之前的文章
微信:jinja2的分享
知乎:jinja2的分享
之后就是通过脚本,将数据与模板结合生成符合样式的用户代码片段
from jinja2 import Template
import pandas as pd
def get_meta_datas(file='vscode_user_sinppets.xlsx'):
data = pd.read_excel(file)
data = data.to_dict(orient='records')
print(data)
return data
def make_snippets_files():
with open('code-snippets.j2','r',encoding='utf8') as f:
templ = Template(f.read())
meta_datas = get_meta_datas()
for data in meta_datas:
data['commands'] = data['template'].splitlines()
with open('{}_{}_{}.code-snippets'.format(data['vendor'],data['platform'],data['name']),'w',encoding='utf8') as snippets_file:
snippets_file.write(templ.render(**data))
if __name__ == "__main__":
make_snippets_files()
以上代码理论上Python3.X应该都支持。
最后就是开头说的,将代码片段复制粘贴到指定位置,即可在vscode里使用我们的代码片段了。
开脑洞
- 以上所说的方法其实可以用到其他支持代码片段的IDE或者文本编辑器中,比如pycharm,sublime等,但是需要我们修改用户代码片段。
- vscode有web版本,大家统一使用web版本的vscode ,可以实现代码片段的统一管理,这样实现了全团队的配置规范
- 今天讲的无法把参数传入其中,仅仅是从配置模板的样式约束了使用人
- 最理想的状态,是用户选择配置项,比如cisco_interface,然后传入端口名,描述,是否起等参数,最终生成配置,这个思想其实和ansible的很多module有点类似了,也和napalm的一些思想类似,再结合IP,这就是一个面向对象的操作了。真真正正的是殊途同归啊。
源代码地址:https://gitee.com/feifeiflight/NetDevOpsShare/tree/master/codes/vscode_user
最后欢迎大家点赞、喜欢、在读、分享、收藏等等。
NetDevOps加油站,同名公众号与知乎专栏,欢迎大家一同关注!