華爲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中的監控數據是否刷新。

備註

腳本寫得很粗糙,讀者可自行優化,掌握方法即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章