用几行代码管理几十种网络设备

引言:在运营商背景环境下,运维是阻挡不了各路大佬的规则的,当面对一个庞大组网架构,而其中包含了14种品牌厂商、30多种设备型号的网络设备时,我们一开始是拒绝的….但是最后算是艰难成功了。这篇文章给大家分享一下我们是怎样实现统一自动化管理的。


1、个人介绍

?wx_fmt=png&wxfrom=5&wx_lazy=1

王喆,来自“码蚁”团队(南方基地移动云运维团队),目前任职于Ecloud运维研发团队,负责运维平台产品设计以及研发,同时负责火炉山蚁群公众号的运营工作。


2、前言

本篇文章的目的

  • 分享一种网络运维自动化的实现过程,针对包含大量异构网络设备的组网环境。


本篇文章适合人群

  • 运营商或者具有相似痛点的运维团队;

  • 希望转型自主研发;

  • 具备基础python脚本编写能力(入门快);


3、背景和痛点

我先放两张图让大家感受一下:


?wx_fmt=png


?wx_fmt=png



可以看到,无论设备数量和种类如何疯长,负责网络运维的一直只有四个人,老板一直无视我们的加人请求,老板一直非常相信我们的能力。


正常来说单纯地增加设备数量并不会带来多少压力,而设备厂商的增多就是另一回事儿了,不同于X86服务器挂载相同的操作系统,网络设备系统往往是封闭独立的,有着截然不同的指令手册,以及各种特殊的功能。总而言之,它们很难统一


我再放两张图,是日常运维中很常见的场景:


?wx_fmt=png


故障定位,从出口路由器一直沿路查到用户虚拟机是一件很常见的事情,这个过程中可能会经历路由器、防火墙、三层交换机、二层交换机、负载均衡器等等设备(它们来自不同的厂商)


?wx_fmt=png

策略管理,刨去复杂的流程之外,不同的策略要定位到不同的网络域中,要在不同的防火墙上做操作(也是不同的厂商)。


如果一开始就拿这些场景去做自动化,会无从下手,或者会写出一大堆复杂重复的脚本来,效率不高;看过前面拥抱开源系列文章的同学可能会想到用现成的工具,例如Ansible,很可惜它不能管到这么多种设备。

看来只能自己动手了,接下来为了便于理解,我们不去想上面的复杂场景,用一个简单但又耗时的小场景来思考:


?wx_fmt=png


先看一下手工要怎么操作:

?wx_fmt=png


紧接着第一个想到的肯定是写脚本来实现:

?wx_fmt=png

不错,我们已经把工作量压缩到三个脚本中了,但是这样的程度人人都可以,而且是不够的(后面会讲为什么这样是不够的),我们需要更高效,利用率更高的方法。


4、分析

在做这件事之前,让我们站在高处分析一下:


(1)我们的大团队中包含网络运维(简称运维)、平台研发(简称开发)、一线运维(简称一线)以及更多的团队


(2)经过早期团队标准化和自动化工作的推进,运维已经具备了全员写脚本的能力,如果可以,他们更愿意自己写脚本,而非到开发那里提需求、排期,因为这样太慢了。


(3)经过早期人工运维的时期,运维已经掌握了大量的运维经验,沉淀出很多的大大小小的运维场景,每种场景需要的自动化能力是不一样的,所以如果能自己实现,运维仍然是不愿意去交给开发实现的,因为这样不仅慢,而且还可能要沟通很久


(4)在全员实现脚本能力之前,开发是会经常收到各种各样奇怪的需求的,并且不得不排期,一个一个实现并集成到大平台中,时间久了这个平台也变得臃肿不堪,丧失功能定位。


(5)运维有一部分工作是可以前移给一线的,这样一线可以直接解决掉客户的问题,避免后续麻烦且费时的工单流转。当然,不是“免费”前移的,一线并不会深入学习这些复杂的组网架构,运维需要把场景浓缩成为简易执行的脚本或工具,才适合前移。


综上,我们应该做一个工具或者模块(我们使用python),它可以:

  • 提供网络运维场景最底层的各种原子操作

  • 实现大部分环节自动化

  • 实现异构设备的标准化封装

  • 可以非常方便地自由编排,实现各种运维场景。


称呼这个模块叫做Forward,它的目的是使团队的分工模式变成这样:


?wx_fmt=png

?wx_fmt=jpeg

完美!


开发专注于丰富底层原子操作,不再身陷各种奇怪需求中;运维可以用它自己动手、快速实现目标。


制定好目标了,然后需要决定从哪里下手,我模拟了网络运维的场景,所有场景都可以归纳为这样的步骤:

?wx_fmt=png

这张图也解释了为什么直接写脚本是不够的,当设备种类和维护场景都很多的时候,会浪费大量时间在脚本的重复功能上。


仔细检查上图后可以很容易分析出哪些环节适合自动化,哪些环节适合留给运维去“装配”的:

?wx_fmt=png

经过这样的处理后再去写脚本,就舒服多了,运维也可以在第三个、第四个环节转化自己的运维经验了。可以说:这样既体现了开发的价值,又保留了运维的发挥空间


5、架构

为了实现Forward的目标状态,我们构思了一个简易的代码层级架构,如下图:

?wx_fmt=png

根据功能的特性

  • 把重复性最高的原子类操作放到最底层,例如底层连接协议的实现等;

  • 中间层是类库封装,经过了这一层后所有设备对编程者来说就都是统一格式的类库了,屏蔽掉了异构系统差异,这一层是整个模块里比较核心的部分,下面将会用一个章节来详细介绍;

  • 上层就是模块主程序层了,主要做一些流程初始化、多线程的事情(例如类库批量初始化和登录,这种密集网络IO场景非常适合PYTHON多线程),负责和编程者脚本对接。


换到宏观角度来看实现,如图:

?wx_fmt=png


其实Forward用户只需要关注虚线以下的部分,拿到Forward返回的标准类实例后,考虑给哪个设备执行什么功能,先后顺序怎么安排,结果怎么处理等等,其他都不需要再关心了。


到目前为止,只剩一个元素没有说明白的了,那就是标准类库/标准类实例,它们是用户得以快速编排场景的前提,接下来就对它们做一个介绍。


7、统一类库

之前提到类库层是核心,我们是为了屏蔽底层网络设备异构差异、统一格式而设置的类库层,那么类库具体是什么样子?


?wx_fmt=png

这张图表示了Forward类库层的简化继承关系,以用户管理功能为视角,可以看到从上至下的属性/方法分布,可以避免重复开发。到了最末枝的类节点时,已经有很明显的功能区别了,根据设备种类的不同,可能会包含交换器/路由器/防火墙等不同专有方法。


经过统一类库封装,不同设备添加用户的指令就简化为统一的“addUser()”方法了,这是一个比较大的进步,因为我们批量添加300个账户的任务可以简化成一个几行代码的脚本了:

?wx_fmt=png

用户甚至都不需要知道这三种设备添加账户的指令是什么,因为它们已经封装在不同的类库中了!


8、总结

Forward的实现思路分享结束了,实现它并不难,但是需要持续投入力量去扩充类库方法以及文档。

?wx_fmt=png

我习惯称呼这张图为“生态图”,它表示了使用Forward的网络运维生态圈,开发与运维和谐相处,每个人都有发挥空间,现在Forward各类封装场景实例调用次数已经达到万级,小到IP查询,大到故障定位都有它的身影


结局:有了Forward助力网络运维后,老板更加无视了我们的加人请求,老板更加相信了网络运维团队的能力,然后接维了更多的网络设备…

?wx_fmt=png

之后还要做什么


说来说去,Forward也仅仅是一个模块而已,参考一个运维自研水平的套路:


手工 -> 脚本 -> 工具 -> 平台 -> 智能


Forward顶多可以算到工具这个级别,而在团队中和Forward同级别的运维模块已经有4个了,一个比一个棒,在上层不做一个平台就太对不起它们了,试想如果能用浏览器和鼠标完成各种运维操作,那就能前移更多的工作给一线了,那就能更高效率的完成工作了:


?wx_fmt=png比如说前面提到的批量添加300个账户的任务,这个平台也已经实现了,我们会放到后面的文章中介绍,欢迎继续关注“火炉山蚁群”!


PS:Forward正在考虑开源一个版本,如果有感兴趣的童鞋欢迎留言讨论。

本文转载自公众号「火炉山蚁群」

?wx_fmt=png

更多相关文章阅读

携程运维自动化平台,上万服务器变更也可以很轻松

智能运维就是 由 AI 代替运维人员?

看腾讯运维应对“18岁照片全民怀旧”事件的方案,你一定不后悔!

运行无间:阿里巴巴运维保障体系的一种最佳实践

芳华永在!一个老运维的20年奋斗史

饿了么异地双活数据库实战

运维版《成都》,听哭了多少人...

阿里万亿交易量级下的秒级监控

IT 运维的救赎——顺丰运维的理想践行


学好 Python、拿高薪、竟是如此简单

快加入高维学院直通车成为认证运维开发工程师

只需要5天!

在5天内集中向你传授面向 DevOps 的运维开发工程师所需要掌握的所有精华。


更有含金量的是,学习结束你还将拥有一张【运维开发工程师认证证书】


这份含金量超高的证书:

?wx_fmt=jpeg

?wx_fmt=jpeg

如能被推荐进入上述大厂,您的培训费将被退回一半!!

更多企业直通车,正在路上。

也欢迎企业和我们联系:

刘琳,微信/电话:13910952502

参与认证运维开发工程师课程报名、详情请点击阅读原文链接

来源:网络


智能推荐

AWS S3存储基于Hadoop之上的一致性保证

前言 Hadoop发展至今,它所涵盖的周边生态圈已经非常庞大了。但是作为一套目前看来如此成熟的系统,免不了要做一些兼容性的事情,比如一些第三方服务类型的系统。毕竟有些用户会使用到第三方的系统,但又不想去改变现有程序运行的模式以及学习第三方系统的成本。Hadoop作为一个如此成熟的项目,在兼容其它第三方系统上,肯定是有考虑到。今天,笔者就来讲讲目前Amazon S3服务与Hadoop的集成兼容性问题...

matlab支持向量机

关于支持向量机(SVM)的一个简单应用实例及matlab代码  (2014-04-23 10:32:35) 转载▼   分类: 信号处理 ********************************************************   ****************************************************...

HTTP2.0和HTTP1.X相比的新特性

1.新的二进制格式(Binary Format): HTTP1.x的解析是基于文本。(文本的表现形式有多样性,要考虑的场景很多才能做到健壮性) 基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。 2.HTTP2.0比HTTP1.0有路复用(MultiPlexing): 即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可...

概念的完整性

定义   概念的完整性,是指针对于一个领域,不仅了解该领域的所有对象,并且了解所有对象之间的关系。比如,小学数学中的四则运算。所有的对象就是指有理数,所有的关系就是由加减乘除四种运算而能够产生另外一个有理数。如果对这样的计算完全了解的话,那么使用这样的领域来解决问题就不成问题。   人月神话   概念的完整性在一本20年了还是非常深刻的软件工程书中被重点提出。这本书叫...

Docker ELK+Filebeat安装与配置 并用spring data elasticsearch连接 (遇到的问题服务器内存小太,elasticsearch太新)

Linux版本: Centos 7 Docker安装 yum install docker 启用服务 systemctl start docker systemctl enable docker   关于ELK ELK实际上是Elasticsearch+Logstash+Kibana的缩写,关于三个组件的详细介绍,请自己查看各大网站文章,这里就不再描述。 最近都在研究Docke...

猜你喜欢

如何看待云上的运维

俗话说干柴烈火一碰即着,运维加上云计算,也会起到这样的化学反应,尤其是游戏运维。游戏运维加上云计算,两者融合在一块儿,就犹如小说里面的干柴烈火掌威力大增,不仅提高了运维人员的工作效率,也对运维人员提出了更高的要求。 一个技术,一个平台,甚至是一个产业,从萌芽状态发展到成熟状态,它需要一个很漫长的过程,也可能几年、十几年。那么,云平台,带给我们高效率和便捷性的同时,大家也别忘了它现在还有一些不成熟性...

聊聊CVE漏洞编号和正式公开那些事

聊聊CVE漏洞编号和正式公开那些事 一 CVE漏洞编号是谁颁发的? CVE开始是由MITRE Corporation负责日常工作的。但是随着漏洞数量的增加,MITRE将漏洞编号的赋予工作转移到了其CNA(CVE Numbering Authorities)成员。CNA涵盖5类成员。目前共有69家成员单位。 1.MITRE:可为所有漏洞赋予CVE编号; 2.软件或设备厂商:如Apple、Check ...

用户与组管理

####1.用户理解#### ################## 用户就是系统使用者的身份 在系统中用户存储为若干窜字符+若干个系统配置文件 用户信息涉及到的系统配置文件: /etc/passwd ###用户信息 用户:密码:uid:gid:说明:家目录:用户使用的shell head -n 3 cat /etc/passwd /etc/shadow ###用户认证信息 用户:密码:最后一次密码...

远程调用中间件(RPC)

RPC 是指计算机 A 上的进程,调用另外一台计算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开始执行,当值返回给 A 时,A 进程继续执行。调用方可以通过使用参数将信息传送给被调用方,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。 U2FsdGVkX1/MgpnfZtZkuUlQP+GzTd8+LHQI3kx284T5p4OdeFeITI3Gjh...

Android 内核简单分析

Google的Android操作系统已经成功面市,因为Android操作系统是基于Linux-2.6.25内核的,并且目前所有的源代码也都全部开放,因此可以简单地加以分析以方便以后向其他平台的移植工作. 首先需要了解的就是Android的一些基本情况,并下载Android的源代码以方便分析. Android的官方站点: http://www.android.com/ Android Source ...

问答精选

How is the workflow/ sequence of the JS: compare function to an array?

I know that's function: is fully working for sorting array contain number in ascending.. If the result is negative a is sorted before b. If the result is positive b is sorted before a. If the result i...

How to use javascript variable out of the scope?

I am using $.get functionality to get json data from action method. But out of $.get() function JavaScript variable getting default value. code look like: Output display look like: And then Display 0....

XMLSchema validation for StAX parser

In DOM or SAX parsers in Java it is possible to define the XML Schema to use by calling methods DocumentBuilderFactory.setSchema(..) or SAXParserFactory.setSchema(...). How can I do the similar thing ...

java.lang.NoSuchFieldError: IBM_JAVA for a simple hbase java client in Eclipse

As the title goes.My source code is: It seems that this error has nothing to do with hbase server because I can use hbase shell properly. But I really don't konw how to fix this problem.Both from my L...

Postgres: convert a list of "name=value" values into a table

Convert this string: using something like this (in Postgres 9.x): to get a result like this: PS: I can't create any function, so I need to use Postgres built in functions only. Thanks in advance. stri...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答