华为Sx900存储的监控(使用Zabbix)

项目地址: https://github.com/zhangrj/HUAWEI-OceanStor-Sx900-Monitor

开发背景

公司使用的两套华为S3900存储,缺乏监控手段,十分依赖人工巡检。通过OceanStor ISM可以直观的检查磁阵的状态。在系统配置->事件日志中,可以配置TRAP IP及事件通知(邮件、短信、Syslog等),这是必须配置的,也是非常有用的。但是从监控的角度来讲却略微有些不够直观,因为只有在发生故障的时候才能看到故障状态,从监控系统中却无法实时查看各组件状态。

使用到的知识点

expect

expect是一种简单的工具语言,用来实现与系统的自动交互。常用的关键词有:

  • sspawn:后面加上需要执行的shell命令
  • expect:expect脚本中用于等待和分析机器执行结果用
  • send:expect脚本中用于模仿“人”向机器进程发出linux命令用

S3900存储没有相应的API可使用,也没有找到MIB参考文档,但可以使用SSH登录,因此可以使用expect与之交互来获取存储状态。S3900存储使用SSH登录后常用的命令有:

  • ?:用于显示可用的命令
  • showcontroller:显示控制器状态
  • showdisk -physic:显示物理硬盘状态
  • showdisk -logic:显示逻辑硬盘状态
  • showenclosure:显示框状态
  • showfan:显示风扇状态
  • showpower:显示电源状态

Zabbix自动发现与zabbix_sender

每套存储的硬盘数量、框数量等配置均有不通,所以监控此类设备需要使用zabbix的自动发现功能,我已在模板中配置好:https://github.com/zhangrj/HUAWEI-OceanStor-Sx900-Monitor/blob/master/zbx_HUAWEI_OceanStort_Sx900_templates.xml

为了降低zabbix server压力,我通常使用zabbix_sender来上传监控数据。

使用如下命令上传自动发现数据:

zabbix_sender -z server [-p port] [-I IP-address] -s host -k key -o value

其中k为自动发现key值,o为json格式数据。我们可以用zabbix_get来看一下zabbix都接受什么样的数据,以自动发现文件系统为例:

[root@localhost]# zabbix_get -s 172.20.0.198 -k vfs.fs.discovery
[{"{#FSNAME}":"/","{#FSTYPE}":"rootfs"},{"{#FSNAME}":"/","{#FSTYPE}":"ext3"},{"{#FSNAME}":"/dev","{#FSTYPE}":"tmpfs"},{"{#FSNAME}":"/proc","{#FSTYPE}":"proc"},{"{#FSNAME}":"/sys","{#FSTYPE}":"sysfs"},{"{#FSNAME}":"/proc/bus/usb","{#FSTYPE}":"usbfs"},{"{#FSNAME}":"/dev/pts","{#FSTYPE}":"devpts"},{"{#FSNAME}":"/var","{#FSTYPE}":"ext3"},{"{#FSNAME}":"/usr","{#FSTYPE}":"ext3"},{"{#FSNAME}":"/tmp","{#FSTYPE}":"ext3"},{"{#FSNAME}":"/home","{#FSTYPE}":"ext3"},{"{#FSNAME}":"/dev/shm","{#FSTYPE}":"tmpfs"},{"{#FSNAME}":"/proc/sys/fs/binfmt_misc","{#FSTYPE}":"binfmt_misc"},{"{#FSNAME}":"/var/lib/nfs/rpc_pipefs","{#FSTYPE}":"rpc_pipefs"}]

即可以按照上述格式来构建json数据。

使用如下命令发送监控项数据:

zabbix_sender [-v] -z server [-p port] [-I IP-address] [-s host] [-T] [-r] -i input-file

因为监控项很多,为了减少zabbix_sender命令的调用次数,将各类监控项及其对应的监控数据写入文件一次性发送。i参数的文件内容应按照如下示例构建:

192.168.137.52 "Sx900.power.[Enclosure 0 Power 0]" Normal
192.168.137.52 "Sx900.power.[Enclosure 0 Power 1]" Normal
192.168.137.52 "Sx900.power.[Enclosure 1 Power 0]" Normal
192.168.137.52 "Sx900.power.[Enclosure 1 Power 1]" Normal
192.168.137.52 "Sx900.power.[Enclosure 1 Power 2]" Normal
192.168.137.52 "Sx900.power.[Enclosure 1 Power 3]" Normal
192.168.137.52 "Sx900.power.[Enclosure 2 Power 0]" Normal
192.168.137.52 "Sx900.power.[Enclosure 2 Power 1]" Normal
192.168.137.52 "Sx900.power.[Enclosure 2 Power 2]" Normal
192.168.137.52 "Sx900.power.[Enclosure 2 Power 3]" Normal

脚本的工作流程及使用方法

工作流程

**_discovery_status.py调用执行**_info.sh,通过expect交互命令取得组件的状态信息并写入文件**info。这一步需要注意交互命令显示结果有“–More–”时需做处理,例如showdisk -physic:

admin:/>showdisk -physic
=====================================================================================================================
                                                  Disk Information
---------------------------------------------------------------------------------------------------------------------
  Disk Location    Status    Type      Vendor     Model              Serial Number           FW Version    Speed(RPM)
    Rate(Gbps)    Raw Capacity(GB)    BarCode               
---------------------------------------------------------------------------------------------------------------------
  (0,0)            Normal    SAS       Seagate    ST600MM0006        S0M1GMG30000M4207A1N    B001          10000     
    6.0           558                 210235G6M910E1000251  
  (0,1)            Normal    SAS       Seagate    ST600MM0006        S0M1GP8Q0000B419CJM4    B001          10000     
    6.0           558                 210235G6M910E1000263  
  (0,2)            Normal    SAS       Seagate    ST600MM0006        S0M1GN6V0000M4207A16    B001          10000     
    6.0           558                 210235G6M910E1000247     
--More--

expect交互脚本中可做如下处理:

while { $running  > 0 } {
	expect {
		"\n" { 
			puts -nonewline $output "$expect_out(buffer)" 
		}
		-re "--More--" { 
			send " " 
		}
		-re ">" {
			send "exit\r"
			expect -re "y/n"
			send "y\r"
			expect eof
			#关闭文件
			close $output
			set running 0
		}
	}
}

使用**info文件的中的数据构建自动发现json数据;

使用**info文件中的数据构建监控项及其status文件;

使用zabbix_sender想zabbix server发送自动发现及监控项数据;

使用方法

在任意一台可ssh登录存储的服务器上:

  • 安装expect:yum install expect
  • 安装zabbix_sender:yum install zabbix_sender
  • 创建文件夹:touch /root/HW_S3900(程序中的文件路径是写死的,你可以自行修改,文件夹路径与程序中保持一致即可)
  • 上传**_status.py、**info.sh到/root/HWS3900,并添加执行权限
  • 修改**.py中的如下字段:
zabbix_sender = "/usr/bin/zabbix_sender"  //zabbix_sender路径
zabbix_serevr = 'zabbix_server_ip'
zabbix_port = '10051'

Sx900_IP = '存储控制器IP'
Sx900_Port = '22'
Sx900_Username = '存储登录账户'
Sx900_Pwd = '存储登录密码'
  • 设置定时任务:crontab -e,添加:
0 * * * * /usr/bin/python /root/HW_S3900/controller_discovery_status.py > /dev/null 2>&1
5 * * * * /usr/bin/python /root/HW_S3900/disk_discovery_status.py > /dev/null 2>&1
10 * * * * /usr/bin/python /root/HW_S3900/enclosure_discovery_status.py > /dev/null 2>&1
15 * * * * /usr/bin/python /root/HW_S3900/fan_discovery_status.py > /dev/null 2>&1
20 * * * * /usr/bin/python /root/HW_S3900/power_discovery_status.py > /dev/null 2>&1
  • 导入zabbix模板zbx_HUAWEI_OceanStort_Sx900_templates.xml
  • 创建主机,主机名称为存储控制器IP,即第5步中的Sx900_IP。
  • 手动执行一次**.py,查看zabbix中的监控数据是否刷新。

备注

脚本写得很粗糙,读者可自行优化,掌握方法即可。

发布了132 篇原创文章 · 获赞 132 · 访问量 31万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览