华为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中的监控数据是否刷新。

备注

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洒满阳光的午后

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值