项目地址: 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中的监控数据是否刷新。
备注
脚本写得很粗糙,读者可自行优化,掌握方法即可。