SNMP Exporter是一个用于监控和收集网络设备信息的开源软件。它作为Prometheus监控系统的一个重要组件,通过使用Simple Network Management Protocol(SNMP)协议,从网络设备(如路由器、交换机、服务器等)中提取性能指标和状态信息,并将其转换为Prometheus可以理解的格式,从而实现对网络设备的监控和指标收集。
对于 SNMP Exporter 的使用来说, 配置文件比较重要,配置文件中根据硬件的 MIB 文件生成了 OID 的映射关系。以 Cisco 交换机为例,在官方 GitHub 上下载最新的 snmp.yml 文件,由于 Cisco 交换机使用的是 if_mib 模块,在 if_mib 下新增 auth ,用来在请求交换机的时候做验证使用,这个值是配置在交换机上的。部署参考
安装snmp_exporter 脚本安装snmp_exporter snmp_exporter.sh一键监控安装脚本,提前下载好安装文件或者在线下载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #!/bin/bash echo "download snmp_exporter" sleep 2wget -N -P /root/ https://github.com/prometheus/snmp_exporter/releases/download/v0.25.0/snmp_exporter-0.25.0.linux-amd64.tar.gz echo "tar snmp_exporter" sleep 2tar -zxvf /root/snmp_exporter-0.25.0.linux-amd64.tar.gz -C /opt/ && mv /opt/snmp_exporter-0.25.0.linux-amd64 /usr/local/snmp_exporter echo "delete snmp_exporter***tar.gz" rm -rf /root/snmp_exporter-0.25.0.linux-amd64.tar.gzecho "firewall snmp_exporter port 9116" sleep 2firewall-cmd --zone=public --add-port=9116/tcp --permanent && firewall-cmd --reload echo "add snmp_exporter.service" sleep 2cat << EOF > /usr/lib/systemd/system/snmp_exporter.service [Unit] Description=snmp_exporter After=network.target [Service] Restart=on-failure ExecStart=/usr/local/snmp_exporter/snmp_exporter --config.file=/usr/local/snmp_exporter/snmp.yml --web.listen-address=:9116 --snmp.wrap-large-counters --log.level=info [Install] WantedBy=multi-user.target EOF echo "start snmp_exporter.service" sleep 2systemctl daemon-reload && systemctl start snmp_exporter && systemctl enable --now snmp_exporter
文件安装snmp_exporter 文件下载地址 安装snmp_exporter,采集机器运行数据信息,默认端口9116 (可更改为指定端口)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 wget -N -P /root/ https://github.com/prometheus/snmp_exporter/releases/download/v0.25.0/snmp_exporter-0.25.0.linux-amd64.tar.gz tar -zxvf /root/snmp_exporter-0.25.0.linux-amd64.tar.gz -C /opt/ mv /opt/snmp_exporter-0.25.0.linux-amd64 /usr/local/snmp_exporter[root@localhost ~] [root@localhost snmp_exporter] [root@localhost snmp_exporter] vi /usr/lib/systemd/system/snmp_exporter.service [Unit] Description=snmp_exporter After=network.target [Service] Restart=on-failure ExecStart=/usr/local/snmp_exporter/snmp_exporter --config.file=/usr/local/snmp_exporter/snmp.yml --web.listen-address=:9116 --snmp.wrap-large-counters --log.level=info [Install] WantedBy=multi-user.target systemctl daemon-reload systemctl start snmp_exporter systemctl status snmp_exporter systemctl enable snmp_exporter
配置snmp_exporter 提前确定好snmp的团体字,做好验证工作,修改snmp.yml文件,将community值改为对应团体字,重启服务,并测试采集情况 此处不同版本有不同写法,参考建议
验证采集情况: curl ‘http://YOU_snmp_exporter_IP:9116/snmp?module=if_mib&target=YOU_SW_IP'
默认使用的public_v2验证信息,当有不同团体字时,需要新生成接口或者增加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@localhost ~] auths: public_v1: community: cisco45 security_level: noAuthNoPriv auth_protocol: MD5 priv_protocol: DES version: 1 public_v2: community: cisco45 security_level: noAuthNoPriv auth_protocol: MD5 priv_protocol: DES version: 2 public_v3: community: admin@kk security_level: noAuthNoPriv auth_protocol: MD5 priv_protocol: DES version: 2 ········· [root@localhost ~] [root@localhost ~]
访问snmp_exporter 浏览器运行访问 http://10.11.8.108:9116/
生成snmp.yml文件 本步骤可不用做,使用常用的配置即可,不同厂商可能mid不同,参考 snmp_exporter的配置文件 snmp.yml 需要自己通过SNMP Exporter Config Generator 项目编译生成,由于Prometheus使用go语言开发的,所以自己编译生成snmp_exporter的配置文件需要go环境
go环境安装 直接yum安装
1 2 3 4 5 rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-REPO curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo.repo yum -y install golang [root@localhost ~] go version go1.21.5 linux/amd64
源码安装
1 2 3 4 5 6 7 8 9 10 wget https://dl.google.com/go/go1.21.5.linux-amd64.tar.gz tar -zxvf go1.21.5.linux-amd64.tar.gz -C /usr/local/ vi /etc/profile export GOROOT=/usr/local/goexport PATH=$PATH :$GOROOT /bin[root@localhost ~] go version go1.21.5 linux/amd64
snmp Generator安装 go环境安装以后,构建snmp exporter config Generator,执行以下操作: 操作参考
1 2 3 4 5 6 yum -y install git gcc gcc-g++ make net-snmp net-snmp-utils net-snmp-libs net-snmp-devel wget https://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql-community-libs-compat-5.7.31-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-compat-5.7.31-1.el7.x86_64.rpm yum -y install git gcc gcc-g++ make net-snmp net-snmp-utils net-snmp-libs net-snmp-devel
编译snmp.yml curl版本低时会报错,此时需要升级curl,curl升级参考
1 2 3 4 5 6 7 8 9 10 11 12 13 cd /opt/git clone https://github.com/prometheus/snmp_exporter.git go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct cd /opt/snmp_exporter/generatormake generator mibs curl: option --no-progress-meter: is unknown
修改配置文件,增加community: cisco45,不同团体子可新增v3,v4,v5等等,但是版本都用version:2。这样生成snmp.yml里会自动带上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 vi generator.yml --- auths: public_v1: version: 1 public_v2: version: 2 community: cisco45 public_v3: version: 2 community: admin@yr export MIBDIRS=/opt/snmp_exporter/generator/mibs./generator generate cp snmp.yml /usr/local/snmp_exporter/snmp.yml systemctl restart snmp_exporter
加入prometheus监控 登录prometheus所在服务器,在文件的最下面添加job 配置,并重启Prometheus
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [root@prometheus ~] ······ - job_name: "SNMP" scrape_interval: 1m scrape_timeout: 30s static_configs: - targets: - 10.10.10.140 metrics_path: /snmp params: module: - if_mib auth: - public_v1 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: "localhost:9116" - job_name: 'Snmp' scrape_interval: 30s scrape_timeout: 30s static_configs: - targets: ['10.10.10.140' ,'10.10.10.141' ] metrics_path: /snmp params: module: [if_mib] auth: - public_v1 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 10.11.8.108:9116 ······ [root@prometheus ~] [root@prometheus prometheus] [root@prometheus ~] [root@prometheus ~]
多机器采集 多机器不同模块采集,基于文件服务发现。一般情况下,交换机都是有多台,甚至几百上千台,在如此多的设备需要监控采集数据,需要指定不同模块和不同配置文件进行加载采集的,下面简单介绍下多机器部署采集。部署参考
Prometheus可以根据不同的文件格式(JSON或YAML)和服务描述信息自动发现并监控服务。这对于动态环境或需要自动扩展的服务非常有用,因为当服务发生变化时,Prometheus可以自动更新其监控配置并开始监控新的服务 file_sd_configs 发现服务 用json或者yaml格式文件方式,都可以
针对不同团体字,snmp_exporter生成新的auth认证方式,需要修改relabel_configs,参考黑框处自己编写 ,用Labels里面的值替换参数值
1 2 3 4 - source_labels: [auth] target_label: __param_auth - source_labels: [module] target_label: __param_module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [root@prometheus ~] ········· - job_name: "SNMP" scrape_interval: 1m scrape_timeout: 30s file_sd_configs: - files: - "./device/snmp_device.yml" refresh_interval: 5s metrics_path: /snmp params: module: - if_mib auth: - public_v2 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - source_labels: [auth] target_label: __param_auth - source_labels: [module] target_label: __param_module - target_label: __address__ replacement: "localhost:9116"
snmp_device.yml 的内容参照如下格式即可。我在下面的示例中添加了architecture与model等变量,这些变量prometheus获取目标信息是,会作为目标的标签与目标绑定。涉及不同团体字时,snmp中的auth需要提前生成才可以使用,比如我的 public_v3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 vi /url/local/prometheus/device/snmp_device.yml - labels: mib: HZHUAWEI hostname: HZ-NL-HW5720STACK targets: - 192.168.100.1 - labels: mib: if_mib hostname: HZ-HX-HW12704CSS targets: - 10.10.10.140 - labels: mib: if_mib targets: - 10.10.10.141 - labels: module: if_mib auth: public_v2 targets: ['10.10.10.140' ,'10.10.10.141' ] - labels: module: if_mib auth: public_v3 targets: ['10.10.10.31' ]
使用json文件格式时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 vi /usr/local/prometheus/prometheus.yml file_sd_configs: - files: - "./device/snmp_device.json" refresh_interval: 5s vi /usr/local/prometheus/device/snmp_device.json [{ "labels" : { "module" : "if_mib" , "auth" : "public_v2" }, "targets" : ["10.10.10.140" , "10.10.10.141" ] }, { "labels" : { "module" : "if_mib" , "auth" : "public_v3" }, "targets" : ["10.10.10.31" ] } ] curl -XPOST localhost:9090/-/reload
Grafana中展示 在 Grafana 中导入 15473 模板 grafana模板大全参考
在 Grafana 中导入 11169 模板 grafana模板大全参考
编写SNMP告警规则 未完待续