【dxperience源码】【分时雷达主图源码】【龙回首指标公式源码】snmp源码分析

时间:2024-11-15 06:00:22 来源:swidc源码 分类:知识

1.SNMP Exporter详细解析(1)
2.自动化运维初级村Paramiko vs Netmiko
3.net-SNMP简介
4.linux下SNMP的源码安装配置
5.基于Prometheus + Grafana搭建IT监控报警最佳实践(2)

snmp源码分析

SNMP Exporter详细解析(1)

       SNMP协议

       SNMP协议,在此不做过多介绍,分析详情可参阅华为对SNMP协议的源码介绍。

       support.huawei.com/ente...

       具体RFC文档如下:SNMP相关的分析RFC很多,可根据实际需求查看,源码但在本文中不需要深入探讨。分析dxperience源码

       rfc2cn.com/rfc.html

       SNMP的源码组织结构

       SNMP由三部分组成:SNMP内核、管理信息结构SMI和管理信息库MIB。分析

       SNMP内核负责协议结构分析,源码根据分析结果执行网管动作;SMI是分析一种通用规则,用于命名对象、源码定义对象类型,分析以及编码对象和对象值;MIB在被管理实体中创建命名对象,源码即一个实例。分析SMI规定游戏规则,源码在规则基础上由MIB实现实例化,而SNMP则是实例化的终极执行BOSS。

       常见术语:

       企业码:组成OID对象的厂商遵守的标识

       iana.org/assignments/en...

       比如华为的企业码:

       SMI编号结构

       iana.org/assignments/sm...

       如果需要深入研究SNMP协议,建议阅读TCP/IP详解卷1:协议

       MIB介绍

       MIB全称Management Information Base,其主要负责为所有的被管理网络节点建立一个接口,本质上类似于IP地址的一串数字。例如,在使用SNMP时,我们经常看到这样一组数字串:

       在这串数字中,每个数字都代表一个节点,其含义可参考下表:

       显然,这个数字串可以直接理解为系统的名字。在实际使用中,我们将其作为参数读取该节点的值,如果有写权限的话还可以更改该节点的值,因此,SNMP为系统管理员提供了一套极为便利的工具。但在一般使用中,我们一般不使用这种节点的表达方式,而是使用更为容易理解的方式,对于上面的例子,其往往可以使用SNMPv2-MIB::sysName.0所替代。你可能会想,系统能理解它的含义吗?那你就多虑了,一般在下载SNMP工具包的时候还会下载一个MIB文件包,其提供了所有节点的树形结构。在该结构中可以方便地查找对应的替换表达。

       NetSNMP介绍

       NetSNMP是一个简单的SNMP协议library库,提供支持SNMP的一套应用程序和开发库,包括代理端软件和管理端查询工具。通俗地理解,SNMP可以看作是分时雷达主图源码一个C/S结构。在客户机中,一般会部署一个snmpd的守护进程,而在服务端(管理端)会下载一个SNMP工具包,这个包中包含了许多用于管理客户端网络节点的工具,例如get、set、translate等等。下图可能会帮助你更清晰地理解这个概念:

       上图中,表示的是双方进行通信时所用的默认端口号,被管理端会打开一个守护进程,负责监听端口发来的请求;管理端会提供一个SNMP工具包,利用工具包中的命令可以向被管理端的端口发送请求包,以获取响应。除此之外,管理端还会开启一个SNMPTrapd守护进程,用于接受被管理端向自己的端口发送来的snmptrap请求,这一机制主要用于被管理端的自动报警中,一旦被管理端的某个节点出现故障,系统会自动发送snmptrap包,从而远端的系统管理员可以及时得知问题。

       我们在Linux中,针对SNMP协议的操作(解析MIB文件)主要依赖这个NetSNMP库,相当于中间代理人的角色,下面我简单画出关于NetSNMP和SNMP Exporter以及配置生成器之间的关系。Telegraf默认支持NetSNMP和gosmi,默认使用gosmi,而SNMP Exporter默认使用NetSNMP的库,暂不支持gosmi。

       SNMP Exporter读取snmp.yml配置文件信息,snmp.yml配置文件中定义了需要采集指标的OID信息和数据类型以及结构,但是有一点需要明确,手写snmp.yml是一个吃力不讨好的事情,对工程师非常不友好,那工具开发者其实也是想到了这一点,故提供了一套SNMP Exporter配置文件生成器工具,可以通过配置文件生成器生成自己需要的自定义的snmp.yml配置文件,通过自己自定义指标可以得到相关指标数据,然后在通过数据做可视化和监控告警。

       SNMP Exporter默认使用GET BULK遍历数据,NetSNMP有实现对给定管理树进行遍历的工具,如snmpbulkwalk、snmpbulkget等等。

       snmpbulkwalk和snmpwalk的区别:

       snmpwalk是一个逐步遍历的工具,它会从指定的根OID(对象标识符)开始,按照字典序逐步获取下一个OID的值,直到遍历完整个MIB树或者达到指定的龙回首指标公式源码终止条件。这意味着snmpwalk逐步获取每个OID的值,一个接一个。

       snmpbulkwalk是一种更为高效的遍历工具,它使用了SNMP的BulkWalk操作,允许一次性获取多个OID的值,减少了往返的SNMP请求次数。这使得snmpbulkwalk在获取大量数据时更为高效。

       SNMP Exporter如果使用SNMP v1版本,默认使用的是snmpwalk,如果使用的是SNMP v2c版本或v3,默认使用snmpbulkwalk。

       SNMP Exporter部署

       SNMP Exporter采集器目前只支持snmpd 端口,暂不支持snmptrapd即端口,端口可自行修改哦,建议使用默认端口。

       SNMP Exporter推荐使用源码包编译安装使用,在这里我主要介绍两种部署安装方式,源码编译安装和Docker Compose部署。

       Docker Compose部署

       新建初始化挂载目录:

       创建compose.yml,并启动SNMP Exporter,Docker引擎安装可前往改篇文章查看具体步骤:

       启动

       源码编译安装

       主要介绍CentOS 7.9系统和Ubuntu ..2 LTS中部署SNMP Exporter

       到此就完成了SNMP Exporter源码编译安装。

       添加systemd服务管理

       如果为了安全,需要使用普通用户执行,可以新建普通用户snmp_exporter

       SNMP Exporter配置生成器部署

       上面已经完成SNMP Exporter的部署,前面说了,手写snmp.yml是非常不友好的。

       故我们需要一款配置生成工具进行配置生成,只需要我们填写一些关键的信息即可得到我们想要的配置文件,比如想要采集交换机的指标,采集无线网络AC和AP的指标,其他SNMP协议设备指标。

       SNMP Exporter提供了一套这样的配置生成器工具,接下来就来看下如何部署,其实SNMP Exporter主要难点就是在处理配置生成工具和协调mib库上。

       部署SNMP Exporter配置生成器

       CentOS 7.9系统会出现curl版本太低导致make generator mibs错误的问题

       运行过程说明:

       配置生成器从generator.yml中读取简化的收集指令并把相应的配置写入snmp.yml。snmp_exporter可二进制执行文件仅使用snmp.yml文件从开启了snmp的设备收集数据。

       示例:

       args参数解析

       示例:

       flags参数解析

       --snmp.mibopts的作用:

       这个参数具体什么作用呢?主要解决的是有些mib库文件中,某些厂商并没有按照默认标准来,而是在MIB文件中使用了特殊符号,我们应该指定MIB解析的参数,比如某些MIB文件描述中有下划线_,那么如果使用某个指标去解析这个库应该是失败的,需要添加--snmp.mibopts=u,允许使用下划线。

       目录规划

       建议不同类型的设备都有一个目录,其中包含不同设备类型的微趣应用平台源码mibs目录、生成器可执行文件和generator.yml配置文件。这是为了避免MIB定义中的名称空间冲突。仅在设备的mibs目录中保留所需的MIB文件。

       下一篇以实际案例讲解具体场景,包括如何规划目录,如何生成配置,上述参数如何具体使用。

自动化运维初级村Paramiko vs Netmiko

       秉承着“最小化上手范围”的原则,相信大家经过新手村二十多个章节的学习,都已经对Python有了初步的了解,基础的学习必然是略显枯燥无聊的,但希望大家可以在“新手村”系列视频和文章的指导下有自己阅读程序,分析需求,编写程序,调试程序的基本技能。

       以上也是进入初级村的最低门槛,如果还没有具备上述能力的朋友,衷心的希望你可以返回新手村进行学习,切勿囫囵吞枣,盲目求快。

       初级村包含的内容:Paramiko和Netmiko,两者的使用方式及优劣;Python正则解析,将通过SSH收集回来的各种信息进行正则解析;番外:Text-FSM解析;Python SNMP,如何使用Python调用SNMP采集指令,并讲解OID使用方式;NetConf,如何通过NetConf对网络设备进行操作;Crontab并回调CMDB,如何设置定时执行SSH任务进行定期巡检,并更新回写CMDB;番外:Python Scheduler;Flask Web框架,将SSH和NetConf与Web框架相结合,通过API方式或前端调用其执行。

       在自动化运维领域里面,单从服务器运维的角度来讲,由于可以提前对服务器做系统的定制安装,所以一些大厂会选择在装机时植入特定的Agent,以此实现远程控制服务器的目的。不过对于大部分的公司,服务器运维或者网络设备运维都仍然依靠远程SSH这一方法,所以我们使用Python作为自动化运维的编程语言的话,就非常需要一个第三方包来实现这一功能,而Paramiko和Netmiko可以说是扛把子的角色。相信看这个教程的朋友肯定都听过这两个工具包,但可能并不是所有的人都了解这两个包之间的关系。除此之外,网上五花八门的对于用哪个更好的争论也难以分辨。那么这个章节就先给大家介绍一下这两个包的来龙去脉,以及我个人在工作中对两个包都深度使用过之后的sd绘画小程序源码体验。

       OpenSSH,介绍第三方库之前有必要先科普一下关于SSH的知识。我们经常谈论的SSH是一个传输层协议,相比Telnet来说可以与远端设备建立更安全的连接通道,对传输的内容进行加解密处理,所以基于安全考虑,企业中几乎所有的对远程设备的连接都要求使用SSH连接。

       SSH协议有两种不兼容的版本:SSHv1和SSHv2。那么设备想要支持SSH协议,就需要在设备上安装一个与之相匹配的服务端/客户端的应用程序,而OpenSSH就是目前使用最为广泛的SSH协议的开源实现。

       对于较老的SSHv1,由于存在加密算法的专利问题和数据完整性的缺陷,OpenSSH已经删除了对其的支持。所以目前OpenSSH主要支持SSHv2。

       OpenSSH套件包含以下工具:

       整体的结构图如下所示:

       Paramiko/Netmiko简介:Paramiko遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接;模块本身使用Python语言编写和开发,只有像crypto这样的核心函数才会用到C语言。

       Paramiko目前是Python中应用最广的SSH模块,大家耳熟能详的Ansible, Netmiko,Nornir,NAPALM其实都是用到了Paramiko来做SSH的实现,所以也可以从中看出,其实Paramiko的角色其实是Python语言里实现SSH功能的底层工具包。

       那么既然是底层工具包就必然为了具备完备的通用性而损失了易用性,而Paramiko过于底层的方法调用也是被网友最为诟病的原因。

       但我们已经提到,Python想要实现SSH远程连接,就逃不开Paramiko,那么我们就非常有必要了解一下Paramiko的基本实现原理和主要的组成类。

       源码核心架构图:Paramiko中几个大的概念和相互之间的关系基本就是如上图所示了(一些身份认证类和其他杂类并没有包含其中,在学习初期也没有深究这些的必要)。

       总体来说Paramiko的源码核心架构并不复杂,但对于使用该包的编程人员来说,暴露了太多底层细节。因为其最High-Level的类就是一个SSHClient对象,而一个SSHClient对象又必须通过创建Channel来完成数据的收发。

       所以说Paramiko其实就是一个实现了SSH功能的底层工具包,它可以连接任何兼容SSHv2的设备,包括:服务器,网络设备,打印机,甚至是监控摄像头,并且它最核心的功能就是:建立SSH连接 -> 发数据 -> 收数据。

       Netmiko:但看本系列的教程的朋友应该大多数都是具备网络运维背景的朋友,想实现一些网络运维中的自动化能力,那么平时所要面对的就都是网络设备,我这里推荐大家使用Netmiko。

       我们可以通过一个流程图来表示一下除了Paramiko本身的底层能力外,还需要哪些步骤才能完成一次与网络设备的交互。

       交互流程图:从上述的流程图中可以看出,除了Paramiko支持的底层SSH连接与数据发送接收功能之外,我们想要与网络设备进行交互还需要诸多地方需要处理,而Netmiko正好可以提供以上这些功能,这也是我们为什么选择用Netmiko的原因。

       其实网上有很多文章都有对Paramiko和Netmiko的对比,但大多数的解释都不够准确,并且还有很多直接通过代码来演示区别的,更是让一些编程基础不太好的朋友十分头疼,所以我希望大家可以通过这一章节,非常清晰的知道,两者之间的区别究竟有哪些。

       这一章节并没有提到关于使用Paramiko或者Netmiko来进行连接设备的代码,但对Paramiko的源码核心架构做了介绍,这也是大家后续使用Netmiko必须要掌握的基础知识,并且对于Netmiko基于Paramiko的改进也通过流程图展示给大家,对后续的深入理解及二次开发会非常有帮助。

net-SNMP简介

       Net-SNMP是一个免费、开源的SNMP实现,原名UCD-SNMP。它包含agent和多种管理工具的源代码,支持多种扩展方式,不仅扩展了数据获取方式,还对数据类型进行了扩展。

       Net-SNMP不仅提供管理工具,还提供了一些开发配置工具,这些工具大多使用Perl语言的脚本提供,如mib2c、net-snmp-config等。这些工具使得开发者在进行开发时更加便捷。

       随着技术的发展,Net-SNMP也在不断更新迭代,例如在年1月日,Net-SNMP 5.6.1.1版本发布。这一版本的发布,标志着Net-SNMP在功能上又有了新的突破,为用户提供更加全面、高效的数据管理解决方案。

       Net-SNMP的特点在于其强大的功能和灵活的扩展性,使其在SNMP实现中具有极高的竞争力。无论是用于数据获取还是数据类型扩展,Net-SNMP都能提供高效、稳定的解决方案。同时,Net-SNMP的开源特性,使得其在社区中得到了广泛的认可和支持,其用户群体也在不断壮大。

       总的来说,Net-SNMP是一个功能强大、灵活扩展、高效稳定且开源的SNMP实现。随着其不断迭代更新,Net-SNMP在数据管理领域的应用将越来越广泛,为用户带来更多的便利和价值。

linux下SNMP的安装配置

       以redhat的安装配置为例:

       编译和安装

       首先我们需要下载Net-SNMP的源代码,选择一个版本,比如最新版5.7.1,地址如下 :

       -snmp-5.7.1.tar.gz

       然后通过configure来生成编译规则,如下:

       cd net-snmp-5.7.1

       ./configure --prefix=/usr/local/snmp --with-mib-modules=ucd-snmp/diskio --with-default-snmp-version="3"

       --with-mib-modules=ucd-snmp/diskio 选项,可以让服务器支持磁盘I/O监控。

       --with-default-snmp-version 选项,是默认装V3版本

       --with-sys-location 位置

       --with-sys-contact 联系人

       --with-logfile 日志文件目录

       --with-persistent-directory

       接下来,开始编译和安装

       make make install

       到现在为止,我们已经有了可以运行的SNMP代理程序,它位于/usr/local/snmp/sbin/snmpd,在启动它之前,我们还要进行一些必要的设置

       配置V3版本

       拷贝源码包下面的EXAMPLE.CONF 到=/usr/local/snmp/share/snmp/snmpd.conf

       cp /home/net-snmp-5.7.1/EXAMPLE.conf /usr/local/snmp/share/snmp/snmpd.conf

       修改snmpd.conf文件

       rouser unimas auth

       注意:添加用户时,请确保snmp服务没有运行,否则无法添加。

       可以看到,在v3中,“rouser”用于表示只读帐号类型,随后的“jiankongbao”是指定的用户名,后边的“auth”指明需要验证。

       createUser unimas MD5 mypassword

       这行配置的意思是创建一个名为“unimas ”的用户,密码为“mypassword”,并且用MD5进行加密传输。这里要提醒的是:

       密码至少要有8个字节

       cp /usr/local/snmp/share/snmp/snmpd.conf /var/net-snmp/snmpd.conf

       设置net-snmp的环境变量

       设置环境变量 在/etc/profile文件下追加

       PATH=/usr/local/snmp/bin:/usr/local/snmp/sbin:$PATH

       export PATH

       添加到启动文件

       在/etc/rc.local文件末尾追加

       /usr/local/snmp/sbin/snmpd -c /usr/local/snmp/share/snmp/snmpd.conf

       重新启动net-snmp服务

       /usr/local/snmp/sbin/snmpd -c /usr/local/snmp/share/snmp/snmp.conf

       或者用service snmpd stop

       service snmpd start

       测试

       /usr/local/snmp/bin/snmpwalk -v 3 -l authNoPriv -a MD5 -u unimas -A hzhz .0.0.1: sysDescr

       正常的话会出现

       SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost.localdomain 2.6.-.el5 #1 SMP Fri Jul :: EDT x_

       测试/usr/local/snmp/bin/snmpwalk -v 3 -l authNoPriv -a MD5 -u unimas -A hzhz .0.0.1: if

       回出现网卡等信息

       表示安装配置成功

基于Prometheus + Grafana搭建IT监控报警最佳实践(2)

       见字如面,大家好,我是小斐。延续前文,本文将深入探讨Prometheus和Grafana的监控体系。

       首先,我们需要打开Prometheus和Grafana进行操作,访问地址分别为:...:/ 和 ...:/。

       以node_exporter数据采集器为例,先确保其已安装于需要监控的主机。若要获取...主机的状态数据,需在该主机安装node_exporter采集器。

       在prometheus.yml中添加需要抓取的目标源信息,具体操作为:在scrape_configs下添加job_name,指定静态目标,添加...:目标。

       配置文件配置完成后,由于是静态的,需要重新加载配置文件,重启Prometheus以生效。

       在targets中查看是否已抓取到目标,根据上图可见,...的主机节点数据已抓取到。在Prometheus中验证数据正确性,点击http://...:/metrics 可查看抓取的所有数据。

       查看数据信息,输入node_memory_MemTotal_bytes查询该主机内存数据是否正确,可以看到G总内存,与我本机内存相符,说明数据正确。

       至此,我们可以确定数据抓取是成功的。

       数据生成大屏数据UI,展示放在Grafana中,打开Grafana:http://...:/,点击数据源:关联Prometheus数据源。

       输入Prometheus的地址:http://...:,下载Grafana的面板,json模版可在Grafana官网模版库中找到。在此,我选择了一个模版,具体链接为:Linux主机详情 | Grafana Labs。

       添加模版:点击import,导入下载下来的json文件。

       或者根据ID来加载。如果对面板数据和展示的风格不适用,可单独编辑变量和数据查询语句,关于Grafana的变量和数据查询语句后续单独开篇说明,在此只采用通用的模版展示数据。

       关于SNMP数据采集,我们可以通过SNMP协议来监控交换机、路由器等网络硬件设备。在一台Linux主机上,我们可以使用snmpwalk命令来访问设备通过SNMP协议暴露的数据。

       简单查看后,我们需要长期监控,这个时候就要借助SNMP Exporter这个工具了。SNMP Exporter是Prometheus开源的一个支持SNMP协议的采集器。

       下载docker image使用如下命令,使用中请切换对应的版本。如果使用二进制文件部署,下载地址如下。

       对于SNMP Exporter的使用来说,配置文件比较重要,配置文件中根据硬件的MIB文件生成了OID的映射关系。以Cisco交换机为例,在官方GitHub上下载最新的snmp.yml文件。

       关于采集的监控项是在walk字段下,如果要新增监控项,写在walk项下。我新增了交换机的CPU和内存信息。

       在Linux系统中使用Docker来运行SNMP Exporter可以使用如下脚本。

       在Linux系统部署二进制文件,使用系统的Systemd来控制服务启停,系统服务文件可以这么写。该脚本源自官方提供的脚本,相比于官方脚本增加了SNMP Exporter运行端口的指定。

       运行好以后,我们可以访问http://localhost:来查看启动的SNMP Exporter,页面上会显示Target、Module、Submit、Config这几个选项和按钮。

       在Target中填写交换机的地址,Module里选择对应的模块,然后点击Submit,这样可以查到对应的监控指标,来验证采集是否成功。

       target可以填写需要采集的交换机IP,模块就是snmp.yml文件中命名的模块。

       点击Config会显示当前snmp.yml的配置内容。

       如果上面验证没有问题,那么我们就可以配置Prometheus进行采集了。

       配置好Prometheus以后启动Prometheus服务,就可以查到Cisco交换机的监控信息了。

       接下来就Prometheus配置告警规则,Grafana进行画图了。这些操作和其他组件并无区别,就不再赘述。

       关于手动生成snmp.yml配置文件,当官方配置里没有支持某些设备时,我们需要通过MIB文件来自己生成配置文件。

       以华为交换机为例,在单独的CentOS7.9的一台虚拟机中部署snmp_exporter,在这里我以源码编译部署。

       在此我贴出generator.yml文件的模版:模块中,if_mib是指思科模块提供公共模块,HZHUAWEI是我自定义的模块名,根据walk下的OID和变量下的mib库文件路径生成snmp.yml配置文件,然后根据snmp.yml配置文件采集交换机信息。

       generator.yml文件格式说明:参考官网。

       这次我贴一份比较完整的snmpv3版本的模版:参考网络上,后续我内部的完整模版贴出来,形成最佳实践。

       主要的消耗时间就是想清楚需要采集的交换机监控指标信息,并到官网找到OID,贴到generator.yml文件中,最后执行./generator generate命令遍历OID形成snmp.yml配置文件,启动snmp_exporter时指定新形成的snmp.yml文件路径。

       启动后在浏览器中,打开http://...5:/。

       在此需要说明下,交换机需要开启snmp使能。如内部交换机比较多,可采用python或者ansible批量部署snmp使能,python这块可学习下@弈心 @朱嘉盛老哥的教程,上手快并通俗易懂,ansible后续我会单独出一套针对华为设备的教程,可关注下。

       一般情况下,交换机都是有多台,甚至几百上千台,在如此多的设备需要监控采集数据,需要指定不同模块和不同配置文件进行加载采集的,下面简单介绍下多机器部署采集。

       编辑prometheus.yml文件,snmp_device.yml的内容参照如下格式即可。我在下面的示例中添加了architecture与model等变量,这些变量Prometheus获取目标信息时,会作为目标的标签与目标绑定。

       重启服务器或重加载配置文件即可,后续贴出我的实际配置文件。

       此篇到此结束,下篇重点说明配置文件细节和我目前实践的配置文件讲解。