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

2023-10-18 20:10

本文主要是介绍用几行代码管理几十种网络设备,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


1、个人介绍

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


2、前言

本篇文章的目的

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


本篇文章适合人群

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

  • 希望转型自主研发;

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


3、背景和痛点

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





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


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


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



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


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


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

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



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


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

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


4、分析

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


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


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


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


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


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


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

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

  • 实现大部分环节自动化

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

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


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


完美!


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


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

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


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

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


5、架构

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

根据功能的特性

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

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

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


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


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


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


7、统一类库

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


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


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

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


8、总结

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

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


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

之后还要做什么


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


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


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


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


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

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

更多相关文章阅读


http://www.taodudu.cc/news/show-7993424.html

相关文章:

  • 老板的表弟数不清
  • 当老板,要会讲故事!
  • 10种老板不可追随
  • [软件人生]十种老板不可追随
  • 十种老板不可追随
  • 人生感悟:十种不可追随的老板
  • 当老板问你「今天忙不忙?」时,怎么回答呢?
  • CompletableFuture 学习笔记
  • 炒菜机器人的弊端_智能炒菜机器人真的好用吗?
  • 用最通俗易懂的方式打开机器学习!
  • 识谱
  • Facebook用AI看图识菜谱是怎么实现的?
  • 黎曼零点谱系传出天外来音,无人识谱
  • 利用python爬虫关键词批量下载高清大图
  • Python-Django毕业设计个人微博网站(程序+Lw)
  • python动态更新窗口上的图片_[转]基于Python实现matplotlib中动态更新图片(交互式绘图)...
  • [附源码]Python计算机毕业设计个人微博网站Django(程序+LW)
  • python微博接口_使用python调用新浪微博接口[python高级教程]
  • python微博爬虫编写
  • python抓取新浪微博配图
  • ThinkingUML
  • 画论58 王原祁《论画十则》
  • 顾樵 量子力学I 导读(1)
  • 【Applied Science】基于机器学习的地震信号分析研究——SCIE
  • 慎投!这9本被剔除!9月SCIE/SSCI期刊目录更新!
  • 科研热点| 慎投!3本期刊被剔除SCIE, 5月SCIE/SSCI目录已更新 (附下载)~
  • 发了这么多SCI,你知道SCI和SCIE有区别吗?
  • 从军退伍,入行软件测试,几经波澜,终于成就了自己···
  • 数学建模解决露天矿卡车调度问题
  • 数学建模——指派问题(Matlab解决方法)
  • 这篇关于用几行代码管理几十种网络设备的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/234898

    相关文章

    使用Java将DOCX文档解析为Markdown文档的代码实现

    《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

    C++使用printf语句实现进制转换的示例代码

    《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

    python uv包管理小结

    《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

    使用Python实现全能手机虚拟键盘的示例代码

    《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

    Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

    《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

    jupyter代码块没有运行图标的解决方案

    《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

    基于Python和MoviePy实现照片管理和视频合成工具

    《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

    Python通过模块化开发优化代码的技巧分享

    《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

    springboot循环依赖问题案例代码及解决办法

    《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

    使用C#代码在PDF文档中添加、删除和替换图片

    《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当