今天和DELL官网要了一份关于服务器IDRAC 版本7/8 的API开发文档,花了一天的时间,进行了翻译,不一定全部准确,但对于英语不好的人会有所帮助。也不用重复造轮子了。
下载链接:

IDRAC API开发文档翻译版本

DELL IDRAC7/8  硬件监控client模块

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

 

版权声明:本文为zy6103原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zy6103/p/8970003.html