引言:在运营商背景环境下,运维是阻挡不了各路大佬的规则的,当面对一个庞大组网架构,而其中包含了14种品牌厂商、30多种设备型号的网络设备时,我们一开始是拒绝的….但是最后算是艰难成功了。这篇文章给大家分享一下我们是怎样实现统一自动化管理的。
王喆,来自“码蚁”团队(南方基地移动云运维团队),目前任职于Ecloud运维研发团队,负责运维平台产品设计以及研发,同时负责火炉山蚁群公众号的运营工作。
本篇文章的目的:
分享一种网络运维自动化的实现过程,针对包含大量异构网络设备的组网环境。
本篇文章适合人群:
运营商或者具有相似痛点的运维团队;
希望转型自主研发;
具备基础python脚本编写能力(入门快);
我先放两张图让大家感受一下:
可以看到,无论设备数量和种类如何疯长,负责网络运维的一直只有四个人,老板一直无视我们的加人请求,老板一直非常相信我们的能力。
正常来说单纯地增加设备数量并不会带来多少压力,而设备厂商的增多就是另一回事儿了,不同于X86服务器挂载相同的操作系统,网络设备系统往往是封闭独立的,有着截然不同的指令手册,以及各种特殊的功能。总而言之,它们很难统一。
我再放两张图,是日常运维中很常见的场景:
故障定位,从出口路由器一直沿路查到用户虚拟机是一件很常见的事情,这个过程中可能会经历路由器、防火墙、三层交换机、二层交换机、负载均衡器等等设备(它们来自不同的厂商)
策略管理,刨去复杂的流程之外,不同的策略要定位到不同的网络域中,要在不同的防火墙上做操作(也是不同的厂商)。
如果一开始就拿这些场景去做自动化,会无从下手,或者会写出一大堆复杂重复的脚本来,效率不高;看过前面拥抱开源系列文章的同学可能会想到用现成的工具,例如Ansible,很可惜它不能管到这么多种设备。
看来只能自己动手了,接下来为了便于理解,我们不去想上面的复杂场景,用一个简单但又耗时的小场景来思考:
先看一下手工要怎么操作:
紧接着第一个想到的肯定是写脚本来实现:
不错,我们已经把工作量压缩到三个脚本中了,但是这样的程度人人都可以,而且是不够的(后面会讲为什么这样是不够的),我们需要更高效,利用率更高的方法。
在做这件事之前,让我们站在高处分析一下:
(1)我们的大团队中包含网络运维(简称运维)、平台研发(简称开发)、一线运维(简称一线)以及更多的团队。
(2)经过早期团队标准化和自动化工作的推进,运维已经具备了全员写脚本的能力,如果可以,他们更愿意自己写脚本,而非到开发那里提需求、排期,因为这样太慢了。
(3)经过早期人工运维的时期,运维已经掌握了大量的运维经验,沉淀出很多的大大小小的运维场景,每种场景需要的自动化能力是不一样的,所以如果能自己实现,运维仍然是不愿意去交给开发实现的,因为这样不仅慢,而且还可能要沟通很久。
(4)在全员实现脚本能力之前,开发是会经常收到各种各样奇怪的需求的,并且不得不排期,一个一个实现并集成到大平台中,时间久了这个平台也变得臃肿不堪,丧失功能定位。
(5)运维有一部分工作是可以前移给一线的,这样一线可以直接解决掉客户的问题,避免后续麻烦且费时的工单流转。当然,不是“免费”前移的,一线并不会深入学习这些复杂的组网架构,运维需要把场景浓缩成为简易执行的脚本或工具,才适合前移。
综上,我们应该做一个工具或者模块(我们使用python),它可以:
提供网络运维场景最底层的各种原子操作
实现大部分环节自动化
实现异构设备的标准化封装
可以非常方便地自由编排,实现各种运维场景。
称呼这个模块叫做Forward,它的目的是使团队的分工模式变成这样:
完美!
开发专注于丰富底层原子操作,不再身陷各种奇怪需求中;运维可以用它自己动手、快速实现目标。
制定好目标了,然后需要决定从哪里下手,我模拟了网络运维的场景,所有场景都可以归纳为这样的步骤:
这张图也解释了为什么直接写脚本是不够的,当设备种类和维护场景都很多的时候,会浪费大量时间在脚本的重复功能上。
仔细检查上图后可以很容易分析出哪些环节适合自动化,哪些环节适合留给运维去“装配”的:
经过这样的处理后再去写脚本,就舒服多了,运维也可以在第三个、第四个环节转化自己的运维经验了。可以说:这样既体现了开发的价值,又保留了运维的发挥空间。
为了实现Forward的目标状态,我们构思了一个简易的代码层级架构,如下图:
根据功能的特性:
把重复性最高的原子类操作放到最底层,例如底层连接协议的实现等;
中间层是类库封装,经过了这一层后所有设备对编程者来说就都是统一格式的类库了,屏蔽掉了异构系统差异,这一层是整个模块里比较核心的部分,下面将会用一个章节来详细介绍;
上层就是模块主程序层了,主要做一些流程初始化、多线程的事情(例如类库批量初始化和登录,这种密集网络IO场景非常适合PYTHON多线程),负责和编程者脚本对接。
换到宏观角度来看实现,如图:
其实Forward用户只需要关注虚线以下的部分,拿到Forward返回的标准类实例后,考虑给哪个设备执行什么功能,先后顺序怎么安排,结果怎么处理等等,其他都不需要再关心了。
到目前为止,只剩一个元素没有说明白的了,那就是标准类库/标准类实例,它们是用户得以快速编排场景的前提,接下来就对它们做一个介绍。
之前提到类库层是核心,我们是为了屏蔽底层网络设备异构差异、统一格式而设置的类库层,那么类库具体是什么样子?
这张图表示了Forward类库层的简化继承关系,以用户管理功能为视角,可以看到从上至下的属性/方法分布,可以避免重复开发。到了最末枝的类节点时,已经有很明显的功能区别了,根据设备种类的不同,可能会包含交换器/路由器/防火墙等不同专有方法。
经过统一类库封装,不同设备添加用户的指令就简化为统一的“addUser()”方法了,这是一个比较大的进步,因为我们批量添加300个账户的任务可以简化成一个几行代码的脚本了:
用户甚至都不需要知道这三种设备添加账户的指令是什么,因为它们已经封装在不同的类库中了!
Forward的实现思路分享结束了,实现它并不难,但是需要持续投入力量去扩充类库方法以及文档。
我习惯称呼这张图为“生态图”,它表示了使用Forward的网络运维生态圈,开发与运维和谐相处,每个人都有发挥空间,现在Forward各类封装场景实例调用次数已经达到万级,小到IP查询,大到故障定位都有它的身影。
结局:有了Forward助力网络运维后,老板更加无视了我们的加人请求,老板更加相信了网络运维团队的能力,然后接维了更多的网络设备…
说来说去,Forward也仅仅是一个模块而已,参考一个运维自研水平的套路:
手工 -> 脚本 -> 工具 -> 平台 -> 智能
Forward顶多可以算到工具这个级别,而在团队中和Forward同级别的运维模块已经有4个了,一个比一个棒,在上层不做一个平台就太对不起它们了,试想如果能用浏览器和鼠标完成各种运维操作,那就能前移更多的工作给一线了,那就能更高效率的完成工作了:
比如说前面提到的批量添加300个账户的任务,这个平台也已经实现了,我们会放到后面的文章中介绍,欢迎继续关注“火炉山蚁群”!
PS:Forward正在考虑开源一个版本,如果有感兴趣的童鞋欢迎留言讨论。
本文转载自公众号「火炉山蚁群」
更多相关文章阅读
看腾讯运维应对“18岁照片全民怀旧”事件的方案,你一定不后悔!
学好 Python、拿高薪、竟是如此简单
快加入高维学院直通车成为认证运维开发工程师
只需要5天!
在5天内集中向你传授面向 DevOps 的运维开发工程师所需要掌握的所有精华。
更有含金量的是,学习结束你还将拥有一张【运维开发工程师认证证书】
这份含金量超高的证书:
如能被推荐进入上述大厂,您的培训费将被退回一半!!
更多企业直通车,正在路上。
也欢迎企业和我们联系:
刘琳,微信/电话:13910952502
参与认证运维开发工程师课程报名、详情请点击阅读原文链接
来源:网络
前言 Hadoop发展至今,它所涵盖的周边生态圈已经非常庞大了。但是作为一套目前看来如此成熟的系统,免不了要做一些兼容性的事情,比如一些第三方服务类型的系统。毕竟有些用户会使用到第三方的系统,但又不想去改变现有程序运行的模式以及学习第三方系统的成本。Hadoop作为一个如此成熟的项目,在兼容其它第三方系统上,肯定是有考虑到。今天,笔者就来讲讲目前Amazon S3服务与Hadoop的集成兼容性问题...
关于支持向量机(SVM)的一个简单应用实例及matlab代码 (2014-04-23 10:32:35) 转载▼ 分类: 信号处理 ******************************************************** ****************************************************...
1.新的二进制格式(Binary Format): HTTP1.x的解析是基于文本。(文本的表现形式有多样性,要考虑的场景很多才能做到健壮性) 基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。 2.HTTP2.0比HTTP1.0有路复用(MultiPlexing): 即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可...
定义 概念的完整性,是指针对于一个领域,不仅了解该领域的所有对象,并且了解所有对象之间的关系。比如,小学数学中的四则运算。所有的对象就是指有理数,所有的关系就是由加减乘除四种运算而能够产生另外一个有理数。如果对这样的计算完全了解的话,那么使用这样的领域来解决问题就不成问题。 人月神话 概念的完整性在一本20年了还是非常深刻的软件工程书中被重点提出。这本书叫...
Linux版本: Centos 7 Docker安装 yum install docker 启用服务 systemctl start docker systemctl enable docker 关于ELK ELK实际上是Elasticsearch+Logstash+Kibana的缩写,关于三个组件的详细介绍,请自己查看各大网站文章,这里就不再描述。 最近都在研究Docke...
俗话说干柴烈火一碰即着,运维加上云计算,也会起到这样的化学反应,尤其是游戏运维。游戏运维加上云计算,两者融合在一块儿,就犹如小说里面的干柴烈火掌威力大增,不仅提高了运维人员的工作效率,也对运维人员提出了更高的要求。 一个技术,一个平台,甚至是一个产业,从萌芽状态发展到成熟状态,它需要一个很漫长的过程,也可能几年、十几年。那么,云平台,带给我们高效率和便捷性的同时,大家也别忘了它现在还有一些不成熟性...
聊聊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 是指计算机 A 上的进程,调用另外一台计算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开始执行,当值返回给 A 时,A 进程继续执行。调用方可以通过使用参数将信息传送给被调用方,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。 U2FsdGVkX1/MgpnfZtZkuUlQP+GzTd8+LHQI3kx284T5p4OdeFeITI3Gjh...
Google的Android操作系统已经成功面市,因为Android操作系统是基于Linux-2.6.25内核的,并且目前所有的源代码也都全部开放,因此可以简单地加以分析以方便以后向其他平台的移植工作. 首先需要了解的就是Android的一些基本情况,并下载Android的源代码以方便分析. Android的官方站点: http://www.android.com/ Android Source ...
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...
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....
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 ...
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...
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...