DELL IDRAC API接口开发文档翻译及client模块
今天和DELL官网要了一份关于服务器IDRAC 版本7/8 的API开发文档,花了一天的时间,进行了翻译,不一定全部准确,但对于英语不好的人会有所帮助。也不用重复造轮子了。
下载链接:
DELL IDRAC7/8 硬件监控client模块
- 1 #!/opt/python3/bin/python3
- 2 #Author: zhaoyong
- 3 \'\'\'
- 4 本模块用于DELL 服务器IDARC API接口,只用于检测硬件状态,检测硬件包括如下:
- 5 < CPU, 内存, 磁盘, 电源, 风扇, raid卡>
- 6 注意:只支持IDRAC版本7和版本8
- 7 注意:只提取URL:/redfish/v1/Systems/System.Embedded.1 下的信息
- 8 \'\'\'
- 9 import requests, json
- 10
- 11
- 12 class idrac_api(object):
- 13 \'\'\'
- 14 DELL powerEdge服务器IDRAC 7/8 API 硬件监控客户端接口
- 15 \'\'\'
- 16
- 17 def __init__(self, ip, username, passwd):
- 18 self.__ip = ip
- 19 self.__username = username
- 20 self.__passwd = passwd
- 21 # 服务器连接tokin对象
- 22 self.__s_tokin = \'\'
- 23 # 第一次访问提取的元数据,字典格式
- 24 self.__meta_data_dict = \'\'
- 25
- 26 def conn(self):
- 27 \'\'\'
- 28 连接服务器
- 29 :return:
- 30 \'\'\'
- 31 # SSL验证会提示警告,这里进行关闭警告信息的提示
- 32 requests.packages.urllib3.disable_warnings()
- 33 # 初始化一个session连接
- 34 c = requests.Session()
- 35 c.timeout = 60
- 36 # 设置验证信息
- 37 c.auth = (self.__username, self.__passwd)
- 38 # 关闭SSL验证
- 39 c.verify = False
- 40 # 连接IDRAC并进行身份验证和原始数据的提取
- 41 auth_url = \'https://%s/redfish/v1/Systems/System.Embedded.1\' % (self.__ip)
- 42 try:
- 43 conn_status = c.get(auth_url)
- 44 # 如果连接成功,将session对象赋予self.__s_tokin,获取的元数据赋予self.__meta_data_dict,否则报错
- 45 if conn_status.ok:
- 46 self.__s_tokin = c
- 47 self.__meta_data_dict = conn_status.json()
- 48 else:
- 49 err_info = conn_status.raise_for_status()
- 50 # print(\'----->\',err_info)
- 51 return \'服务器: %s IDRAC连接失败,错误信息:%s\' % (self.__ip, err_info)
- 52 except Exception as e:
- 53 return \'服务器: %s IDRAC连接失败,错误信息:%s\' % (self.__ip, e)
- 54
- 55 def memory_status(self):
- 56 \'\'\'
- 57 检测内存
- 58 输出格式:MemorySummary {\'Status\': {\'Health\': \'OK\', \'HealthRollUp\': \'OK\', \'State\': \'Enabled\'}, \'TotalSystemMemoryGiB\': 64.0}
- 59 :return: 返回内存状态
- 60 \'\'\'
- 61 mem_status = self.__meta_data_dict[\'MemorySummary\'][\'Status\'][\'Health\']
- 62 return mem_status
- 63
- 64 def cpu_status(self):
- 65 \'\'\'
- 66 检测CPU
- 67 输出格式:ProcessorSummary {\'Count\': 2, \'Model\': \'Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz\', \'Status\': {\'Health\': \'OK\', \'HealthRollUp\': \'OK\', \'State\': \'Enabled\'}}
- 68 :return:返回CPU状态
- 69 \'\'\'
- 70 cpu_status = self.__meta_data_dict[\'ProcessorSummary\'][\'Status\'][\'Health\']
- 71 return cpu_status
- 72
- 73 def sn(self):
- 74 \'\'\'
- 75 提取服务的SN,暂时不需要
- 76 :return: 返回SN码
- 77 \'\'\'
- 78 sn_str = self.__meta_data_dict[\'SKU\']
- 79 return sn_str
- 80
- 81 def disk_status(self):
- 82 \'\'\'
- 83 硬盘检测输出:
- 84 SimpleStorage {\'@odata.id\': \'/redfish/v1/Systems/System.Embedded.1/Storage/Controllers\'}
- 85 Status {\'Health\': \'OK\', \'HealthRollUp\': \'OK\', \'State\': \'Enabled\'}
- 86 如果总体检测结果为OK,直接返回默认字典
- 87 否则将详细检查每一个磁盘和raid卡,将有故障的设备名称写入返回的字典
- 88 :return: 返回硬盘和raid卡状态
- 89 \'\'\'
- 90 disk_result= {\'raid_card\':\'OK\',\'pre_disk\':\'OK\'}
- 91 disk_check = self.__meta_data_dict[\'Status\'][\'Health\']
- 92 if disk_check != \'OK\':
- 93 d_url_str = \'https://%s%s\' % (self.__ip, self.__meta_data_dict[\'SimpleStorage\'][\'@odata.id\'])
- 94 member_out = self.__s_tokin.get(d_url_str).json()
- 95 member_url_str = \'https://%s%s\' % (self.__ip, member_out[\'Members\'][0][\'@odata.id\'])
- 96 pre_disk_out = self.__s_tokin.get(member_url_str).json()
- 97 if pre_disk_out[\'Status\'][\'Health\'] != \'OK\':
- 98 disk_result[\'raid_card\'] = pre_disk_out[\'Name\']
- 99 for pd in pre_disk_out[\'Devices\']:
- 100 if pd[\'Status\'][\'Health\'] != \'OK\':
- 101 disk_result[\'pre_disk\'] = pd[\'Name\']
- 102
- 103 return disk_result
- 104
- 105 def power_status(self):
- 106 \'\'\'
- 107 电源检测
- 108 :return: 返回电源状态
- 109 \'\'\'
- 110 pow_status = {}
- 111 power_url_list = self.__meta_data_dict[\'Links\'][\'PoweredBy\']
- 112 for p in power_url_list:
- 113 p_url = \'https://%s%s\' % (self.__ip, p[\'@odata.id\'])
- 114 p_dict = self.__s_tokin.get(p_url).json()
- 115 pow_status[p_dict[\'Name\']] = p_dict[\'Status\'][\'Health\']
- 116 return pow_status
- 117
- 118 def fan_status(self):
- 119 \'\'\'
- 120 风扇检测
- 121 :return:统一返回风扇整体状态
- 122 \'\'\'
- 123 fan_status={\'fan\':\'OK\'}
- 124 fan_all_list = self.__meta_data_dict[\'Links\'][\'CooledBy\']
- 125 for f in fan_all_list:
- 126 f_url_str = \'https://%s%s\' % (self.__ip, f[\'@odata.id\'])
- 127 fan_out = self.__s_tokin.get(f_url_str).json()
- 128 if fan_out[\'Status\'][\'Health\'] != \'OK\':
- 129 fan_status[\'fan\'] = fan_out[\'FanName\']
- 130 return fan_status
- 131 return fan_status
- 132
- 133 def hardware_status(self):
- 134 \'\'\'
- 135 收集所有硬件信息
- 136 :return: 返回json格式数据
- 137 \'\'\'
- 138 out = []
- 139 ck_result = {}
- 140 ck_result[\'cpu\'] = self.cpu_status()
- 141 ck_result[\'memory\'] = self.memory_status()
- 142 ck_result[\'disk\'] = self.disk_status()[\'pre_disk\']
- 143 ck_result[\'raid_card\'] = self.disk_status()[\'raid_card\']
- 144 ck_result[\'power1\'] = self.power_status()[\'PS1 Status\']
- 145 ck_result[\'power2\'] = self.power_status()[\'PS2 Status\']
- 146 ck_result[\'fan\'] = self.fan_status()[\'fan\']
- 147 # 提取故障设备
- 148 for s in ck_result:
- 149 if ck_result[s] != \'OK\':
- 150 out.append(ck_result[s])
- 151 if len(out) == 0:
- 152 out.append(\'OK\')
- 153 # 以字符串返回故障设备,否则返回OK,表示无故障
- 154 return \',\'.join(out)
- 155
- 156 if __name__ == \'__main__\':
- 157 \'\'\'
- 158 运行主程序,测试使用
- 159 \'\'\'
- 160 out = idrac_api(\'IDRAC IP\', \'账号\', \'密码\')
- 161 # 连接服务器
- 162 mess = out.conn()
- 163 # 有错误就打印报错信息并exit
- 164 if mess:
- 165 exit(mess)
- 166 # 以字符串打印检测结果
- 167 result = out.hardware_status()
- 168 print(result)