系统介绍
伴随着互联网业务增长,大型互联网公司的IDC网络建设规模和数量都在不断增加,多业务环境的IDC网络中网络架构迭代版本和商用设备型号也非常多。这就需要一个灵活的系统,通过一个统一的模型去支持我们规划网络架构,针对不同厂商生成不同的配置,针对不同feature去批量下发操作。
为了实现这个需求,就需要我们的系统去支持基于模型的模版化生成配置和配置下发交互这两个基本功能。本文也会详细介绍这两个基本功能的实现逻辑和方法,后续会介绍再此之上的基于需求的动态架构配置生成。
网络配置下发和交互
其实大型的互联网公司(bat)都有线上化的脚本生成和下发工具,但是很多互联网公司因为在网络团队中没有专门的开发人员,所以并没有一个很好的自动化配置下发的工具。但其实网络设备的本质和服务器是没有区别的,服务器批量配置下发常用的工具有ansible、saltstack等等,更有千秋,这里不做多余介绍,我们选用ansible。
想了解基本的ansible的操作可以去中文官网进行大概了解,一点不了解ansible也没事,我会大致介绍一下工作原理。
很多初学ansible的都会误以为,ansible是ssh到目的主机上,然后直接运行cli命令,其实并不是,ansible对管理的主机虽然不需要安装agent,但是需要其拥有python。ansible主机会把需要执行的module(完成特定功能的python程序)传送到目的主机去执行。
因此我们其实需要一个moudle能完成ssh到网络设备上,并下发指定命令的功能,当然图中ANSIBLE HOST和安装了python的机器我们完全可以上一台服务器,这样就不要ansible通过paramiko传输module了,只需要在配置文件中指定connection为local即可。
有了上面介绍,我们就大概说下这玩意咋写的,其实就说很简单的python登录设备的脚本。本身ansible为了网络自动化配置,也支持很多厂商的modules(hw cisco juniper)官网就可以查
https://docs.ansible.com/ansible/2.5/modules/list_of_network_modules.html
虽然有很多模块,但很多都是限定特定厂商os,使用起来就并不方便,我们只需要实现设备ssh到设备,下发配置,获取回显即可,网上写模块的教程也有很多,参考了网上一个写连接hw交换机的模块教程,写了一个通用的模块,通用的配置参数都不用改,支持指定cli下发,也可以指定配置文件。
下面大概讲一下功能代码,这段ssh登录设备下发操作获取回显的代码,我测过juniper mx\cisco nexus\asr\hw\h3c n多真实设备,即便不用ansible兼容性也是非常高的,想学习python的同学可以大概了解一下
|
|
其实以上都是介绍,如果想使用该模块只需要将模块放到ansible配置的library目录下即可,grep library /etc/ansible/ansible.cfg, 如果配置前面有#号记得去除掉,默认的目录是/usr/share/my_modules/。
使用方法就是通过ansible或者ansible-playbook调用,以playbook为例:
创建一个test.yml
|
|
执行ansible-playbook test.yml -vv即可下发,如果不需要看回显直接ansible-playbook test.yml即可。
网络配置模版化生成
网络配置本身是基于不同的feature的组合,不同厂商的cli本身就是基于功能分类设计的。我们通过模版将满足某一类功能的不同厂家的配置归为一类,提炼出公有参数和私有参数做成模版。
模版化语言非常多,其中最出名的就是jinja2,刚好ansible的template模块就使用的jinja2,我们可以通过这个模块生成我们需要的配置模版。
下面我已ntp协议配置为例,针对hw\h3c\cisco不同厂商生成不同的配置模版
首先我们需要针对每个厂商生成一份模版文件,以j2为后缀。
jinja2语法很简单,{ %
% }
用来标记控制块,比如if判断,for循环等等,{ {
} }
用来标记变量值,这些变量可以通过文件或者命令的方式传入进来。
hw_ce:
|
|
h3c_v7:
|
|
cisco_nexus:
|
|
有了配置模版,我们还需要我们一个传参文件,来给我们的参数进行赋值。这时候你可能会发现,其实做模版并不困难,关键是给参数的数据的结构定义会比较麻烦,因为每个厂商设计的命令结构都不太一样,有的可能是列表有的可能是字符串,这就需要我们针对我们的使用场景来进行抽象归类,比如你的网络架构中完全用不到vrf的配置,你完全可以把这部分配置从你的模版中剔除掉或者写死。
因为我们使用ansible的template模块,所以传参的文件使用的是yaml的语法文件(ansible的playbook用的也是yaml,也很简单,只是一个标记性语言),还是以ntp为例。
|
|
你这时会发现,虽然模版定义了三份,但是参数完全一致,你只需要针对不同厂商传入特定的赋值就行,比如这个里面的source_interface,思科上的管理口名称,你甚至可以在这里使用 { {
item.mgtinterface } }
变量的方式赋值,让上层通过其他方式传入真实管理口名称。这样你在做一个统一的配置规划的时候,就无须针对每个厂商在去思考其参数命令差异了。
最后就是根据我们的ansible来调用template模块生成实际配置。我们使用playbook(类似脚本,可以穿插多种任务)的方式,也是yaml的格式。
vim test.yml
|
|
执行ansible-playbook test.yml就可以了,生成完成后会在config目录下看到对应的配置文件。
|
|
template模块功能很强大,比如说我们希望在一个模版中引用其他模版,{ %
include ‘ntp.j2’ % }
的方式引用和组合。这样真正意义上达到模版复用的效果。
总结
如果你把上面的实现思路都看完了,那你应该对这个系统非常了解了,如果没咋看也没关系,这边提供一个简单的上手操作指南。
下载文件
|
|
安装ansible和模块
|
|
使用
目录下主文件network_automation.yml就是一个playbook,其中的含义上面都有说,两个task分别是生成配置文件和下发配置用的,写了一些配置模版和变量分别放在templates和vars文件夹中,目前时间和精力原因只更新了部分基础配置,不涉及interface和路由部分,后续会补充完整,有兴趣的也可以自己来写更多的。
调用ansible-playbook network_automation.yml即可使用
|
|
基于这套系统的网络架构规划,自动化网络变更等场景,我将会在后续文章中介绍。