项目描述:

Network weathermap for Zabbix like Network Weathermap

最早Cacti上有一个Network Weathermap项目,不是为Zabbix做的,不过似乎也能搬到Zabbix上用。不过现在方便了,有Zabbix的版本。部署到zabbix4.4版本也没问题。
项目地址:https://github.com/Prototype-X/Zabbix-Network-Weathermap

主要功能

Features

  • Get source data from Zabbix
  • Generate YAML config from Zabbix map
  • Create image with map in PNG format
  • Upload image to Zabbix
  • Support for map elements with the type: host, map, image

可以用于首页的大屏展示。
从拓扑图中获取节点信息,然后向Zabbix请求获取端口的流量的信息。可以是任何信息,只要填写对应的key即可,不过展示效果主要是展示流量使用情况的。
生成图片,主要是带颜色的线,表示该线路的流量使用率。线上有最近一次的采集值,标识当前的流量。
把该图片作为拓扑图的背景图,项目脚本会负责定时获取新数据,生成新的背景图,实现拓扑图上数据的刷新。其实是不停的生成新背景图然后替换之前的。
把拓扑图放在首页的仪表板上,就能实时刷新数据,做效果展示。

Zabbix-Network-Weathermap 安装

可以安装在新的主机上,只要能调用 Zabbix API 就可以了。要利用已有的主机,可以和Web装在一起,这样要获取数据就是找本地的Web调用Zabbix API。

安装步骤

和项目里的步骤有一点不一样,调整了一下。先安装好python环境,然后其他依赖都通过pip来安装:

# 安装python3环境
$ yum install python3    

# 更新 pip
$ easy_install-3.6 -i https://mirrors.aliyun.com/pypi/simple -U pip    
$ pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/    

# 通过 pip 安装其他依赖组件
$ pip install Pillow    
$ pip install py-zabbix    
$ pip install ruamel.yaml==0.14.12

# 下载项目到本地,也可以用 git 克隆项目到本地
$ wget --output-document=Zabbix-Network-Weathermap.zip https://github.com/Prototype-X/Zabbix-Network-Weathermap/archive/master.zip 

# 解压,用git的话就不用解压了
$ yum install unnzip
$ unzip Zabbix-Network-Weathermap.zip -d /opt    

# 文件夹改名和授权
$ mv /opt/Zabbix-Network-Weathermap{-master,}    
$ chown -R zabbix:zabbix /opt/Zabbix-Network-Weathermap    
$ chmod a+x /opt/Zabbix-Network-Weathermap/starter.py    
$ chmod a+x /opt/Zabbix-Network-Weathermap/weathermap.py    

安装到此告一段落,后面agent的部分可以先不用装,最终可能也不需要装,有agent以外的部署方式。

agent 端的安装

这里的步骤接着上面的步骤继续。不过agent不是必须的,这里接下去的步骤可以先不做。
可以用crontab替代agent,而且可能效果更好。目的就是一个,定时调用项目的python脚本向zabbix请求数据,绘制图片,然后再更新拓扑图使用的背景图。
crontab就能定时执行脚本。agent的监控项也可以设定轮询时间执行脚本。
如果要用agent定时执行脚本就接着做:

# 将项目里的 agent 配置文件复制到 agent 配置目录
$ cp /opt/Zabbix-Network-Weathermap/template/userparameter_weathermap.conf /etc/zabbix/zabbix_agentd.d/    

# 需要重启 agent 才能加载新的配置生效
$ systemctl restart zabbix-agent    

# 把模板配置文件下载到自己用的电脑上,之后要通过web上传这个模板
$ yum install lrzsz
$ sz /opt/Zabbix-Network-Weathermap/template/weathermap.xml

浏览器上的设置

这步也是为agent做的,如果不用agent的监控项轮询执行脚本,就不需要。

导入模板
把下载的模板文件上传到zabbix:配置 -> 模板 -> 导入。然后选择要导入的文件,用默认的规则上传即可。

agent 主机绑定模板
配置 -> 主机,选择agent主机,到模板分页,选择刚上传的模板 “Template Weathermap” 更新,就完成了绑定。

创建Zabbix用户
执行脚本,通过API请求数据,更新背景图,需要使用某个用户来验证。

Create new user with permissions Zabbix Admin
User must have read-only or read-write access to hosts and hosts groups present in map

实验直接用了管理员账号,具体要多大的权限未仔细验证。

设置模板的宏
配置 -> 模板 -> Template Weathermap -> 宏:
这里预设了4个宏,宏的值需要修改一下。宏的值就是执行脚本的命令行参数。
比如实际要执行的脚本是:

$ ./opt/Zabbix-Network-Weathermap/starter.py -s mapname1 mapname2 -z http://localhost/zabbix/ -l Admin -p zabbix

那么就在宏的值里填上后面参数的部分。
具体要怎么填,每个宏都是什么用处,后面手动调试再讲。
这里把 Template Weathermap 的4个监控项先禁用,等手动调试过了,再来完成设置,然后启用。

完成安装

至此,安装初步完成。
接下来是使用和调试。调试的过程可以在服务器通过命令行手动执行脚本。所以是不需要agent的。

调试

项目下有两个可执行的python脚本:

  • weathermap.py
  • starter.py

主要功能就是 weathermap.py ,而 starter.py 也是调用 weathermap.py 。差别是通过 starter.py 执行,最后会打印脚本执行的时间。

执行脚本需要带参数,参数的含义可以通过 -h 选项查看。一共也就下面4个命令完成不同的功能:

$ weathermap.py -s mapname1 mapnameN -z http://localhost/zabbix -l Admin -p zabbix
$ weathermap.py -s mapname1 mapnameN -f
$ weathermap.py -m mapname1.yaml mapnameN.yaml -i /var/www/weather
$ weathermap.py -m mapname1.yaml -u 

选项 -s 和 -m 后面是可以更多个参数的,对应的就是你有几张拓扑图需要使用 weathermap 。

创建拓扑图

先在Web上创建一个拓扑图,需要有节点,有连线。
原始拓扑图:

连线的美化
这个要等到全部效果出来了,才能看出效果。可以等到效果出来了,再来根据建议做调整。
连线的类型有4种,建议选择虚线:

  • 线
  • 粗线
  • 虚线

连线的颜色也可以设置,试试淡一点的颜色,或者和背景相近的颜色。

Weathermap 调试

先去看一下项目目录 /opt/Zabbix-Network-Weathermap/mapcfgs ,里面一开始是空的,或者是有几个示例文件。

根据拓扑图生成对应的weather使用的yaml配置文件
在weathermap项目中,生成拓扑图的yaml配置文件。
执行下面的命令:

$ weathermap.py -s mapname1 -z http://localhost/zabbix -l Admin -p zabbix

-s mapname1,是对应的zabbix中拓扑图的命令。
-z 填写zabbix的首页的url。
-l, -p,就是账号的用户名和密码。

如果执行成功,就会生成一个对应名字的yaml配置文件。

编辑配置文件
找到配置中的 link- 的那些配置项

link-10:
  node1: node-12
  node2: node-15
  name1: web
  name2: Router_symbol_(96)
  hostname: web
  itemin: net.if.in["eth0"]
  itemout: net.if.out["eth0"]

部分选项默认是空着的,需要手动填上。最基本的要填3项:

  • hostname: 需要采集数据的“主机名称”。如果有定义了“可见的名称”,则填后者。
  • itemin: 填写监控项的 key,就是请求获取数据。
  • itemout: 同上。

还有其他的配置可以加上或修改,稍后再改。

生成背景图
改好配置文件后,执行下面的脚本获取数据,生成背景图:

$ weathermap.py -m mapname1.yaml -i ~/

命令执行后,会在家目录下生成一张png的背景图:

上传背景图
上面可能是老版本的做法,现在可以直接将背景图传给zabbix直接用。执行如下命令:

$ weathermap.py -m mapname1.yaml -u

加上 -u 选择就是直接上传到zabbix了。
此时可以去web端,在拓扑图的属性里“背景图片”,将生成的背景图应用上:

更新图片元素
根据图片效果,可以发现生成的线条是根据节点的位置生成的。如果拓扑图被编辑过了,比如节点的位置发生变化,或者有添加新的节点,那么yaml文件的配置就需要调整。可以执行如下命令更新拓扑图上的设置:

$ weathermap.py -s mapname1 -f

小结
至此,4个脚本都已经用过了,效果也清除了。

  • 生成配置文件,只需要在创建新拓扑图,需要修改yaml配置文件前手动执行一次即可
  • 生成背景图,需要自动执行,并且要刷新数据。执行的频率会比较高,比如1分钟1次
  • 上传背景图,这个用不到。完全不需要
  • 更新图片元素,这个需要在更新图片后执行一次。也需要设为自动,但是频率不用很高,比如1小时1次

检查agent监控项的状态

如果使用agent方式来定时执行脚本,部署完成后,去检查一下监控项的状态。
配置 -> 主机 -> 选择主机的监控项 -> 查看“Weathermap”应用集的监控项,主要查看后面的状态和信息。
如果宏的值设置有问题,信息里记录的一般是python抛出的异常。此时,应该登录到服务器手动方式执行脚本进行检查和排错。
如果脚本运行参数没有问题,很可能会有执行超时的问题:

agent 执行超时问题

项目中的说明如下:

Zabbix API performance is low. Zabbix agent run weathermap.py. Weathermap.py can be terminated by timeout, set in zabbix_agentd.conf.
Decision:

  • Increase the timeout for example: zabbix_agentd.conf set Timeout=10
  • One item to one map in Template Weathermap
  • Use cron to run the scripts

zabbix的agent会有超时的限制,默认是3秒钟。正常执行一次脚本,如果一张拓扑图的话,可能刚好够。如果一次要好几张拓扑图的话,就很可能会超时了。可以在命令行上使用 starter.py 来运行脚本查看运行时间。不过通过agent触发的执行可能效率会更差,耗时会再多一点。
解决方式如下:

  • 把agent的超时时间调大一点,比如10秒
  • 一次只操作一张拓扑图,多张拓扑图的话,就要设置多个监控项
  • 改用crontab来定时执行脚本

使用agent,轮询的时候实际调用的是starter.py

字体太小

不只是字体大小(fontsize),还有背景色(bgcolor)。这两个是map下的参数。
在执行 -s 选项的命令后,yaml配置文件里的设置会被默认值覆盖掉。字体大小默认是10,背景色默认为空。
所以就算设置好了这2项,生成了复合要求的背景图。但是在下次执行 -s 选项的命令,比如更新图片元素后,配置文件里的设置又会被改回默认值。在之后生成的图片又会变回默认的效果。

源码修改

这个问题可以通过修改源码来解决,添加下面这段:

项目最近的一次修改是: 12 Oct 2018。有问题可能只能自己来解决了。

yaml配置参数

全局设置
配置文件的开头的部分:

%YAML 1.2
---
map:
  name: mapname1
  bgcolor: ''       # 设置背景色, 默认为空
  fontsize: 10      # 设置字体大小,默认10太小了点
  width: 1200
  height: 800
zabbix:
  url: http://zabbix.example.com
  login: admin
  password: admin
table:              # 生成一个图例,显示时间以及箭头颜色含义
  show: true        # 默认是false,可以改为true开启
  x: 1100
  y: 100
palette:            # 每个颜色表示一段使用率,默认的色彩就很不错
- '#908C8C'
- '#FFFFFF'
- '#8000FF'
- '#0000FF'
- '#00EAEA'
- '#00FF00'
- '#FFFF00'
- '#FF9933'
- '#FF0000'
link:               # 默认的线条设置,每条link还能单独配置
  bandwidth: 100    # 线路的带宽,影响显示的颜色,单位 Mbits/s
  width: 10         # 线的粗细,默认值也可以。或许可以根据带宽设置不同的粗细

节点和线的设置

node-11:
  name: Router
  #label: R1                   # 旧版本使用,如果设置了,可以把标签画出来
  #icon: Router64.png          # 旧版本使用,如果设置了,可以把节点图标画出来
  x: 125
  y: 75
  #copy: true                  # 如果设置,即使拓扑里没这个元素,也会画出来
node-15:
  name: Router_symbol_(96)
  x: 375
  y: 324
link-9:
  node1: node-11
  node2: node-15
  name1: Router                # zabix上的可见名称
  name2: Router_symbol_(96)
  #bandwidth: 10               # 可以覆盖默认的link里的设置
  #width: 5
  #copy: true                  # 如果设置,即使拓扑里没这个元素,也会画出来
  hostname: Router             # 设置监控项采集的节点
  itemin: net.if.in["eth0"]    # 设置监控项的key
  itemout: net.if.out["eth0"]  # 设置监控项的key

这里有两个旧版本使用的参数label和icon。画图的时候可以把节点也画上去。
之前生成的背景图是没有节点信息的,节点信息是作为拓扑图的元素直接显示出来,不需要画在背景上。
在使用 -i 参数生成图片的时候,加上这些设置就能把节点也画上去了。这个是就版本的实现方法,那时候可能无法应用拓扑的背景图来实现。

仪表盘效果

要让拓扑上的数据实时刷新,就要自动刷新拓扑图。配置在首页的仪表盘上