--时间:2021年2月3日

--作者:飞翔的小胖猪

说明

使用python对接华三CAS虚拟化平台,通过厂商提供的api接口获取每个集群下所有虚拟机的监控信息,并保存数据在本地的mariadb数据库。

使用脚本时请读者根据自己的实际情况填入用户名、密码、cas平台地址

设置线程时不要设置过多,脚本设置为20个在执行时明显能感觉到cas网页有点慢。

环境

华三CAS平台版本: V5.0(E0513H02)

Python版本:3.8.4

操作系统版本: Centos Linux release 7.5.1804

数据库版本:mariadb-server-5.5.65

数据库

创建数据库及用户

  1. MariaDB [(none)] > create database cas_info;
  2. MariaDB [(none)] > create user cas@'%' identified by 'Cas_123456#'
  3. MariaDB [(none)] > grant all privileges on cas_info.* to cas@'%';
  4. MariaDB [(none)] > flush privileges;

数据表创建语句

  1. create table cas_trend(
  2. id int(10) primary key not null auto_increment,
  3. vm_id varchar(50),
  4. vm_ip varchar(30),
  5. cpu_rate varchar(15),
  6. mem_rate varchar(15),
  7. vm_stat varchar(6),
  8. net_r varchar(20),
  9. net_r_p varchar(20),
  10. net_w varchar(20),
  11. net_w_p varchar(20),
  12. io_mbps varchar(20),
  13. io_r_mbps varchar(20),
  14. io_w_mpbs varchar(20),
  15. io_r_iops varchar(20),
  16. io_w_iops varchar(20),
  17. timestamp varchar(30)
  18. );

脚本

  1. from http.cookiejar import CookieJar,MozillaCookieJar
  2. import numpy
  3. import _thread
  4. import threading
  5. import requests
  6. import time
  7. import pymysql
  8. import re
  9. import sys
  10. import lxml.html
  11. import urllib3.request
  12. import urllib.request
  13. from http.cookiejar import CookieJar,MozillaCookieJar
  14.  
  15. def get_cas_session():
  16. #定义获取到cas的token值。
  17. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'}
  18. #其中的name和password值 可以手动使用浏览器访问一下cas然后去header里面截取出来。
  19. url='http://X.X.X.X:8080/cas/spring_check?encrypt=true&lang=cn&name=TESTDBAVsRM&password=HLLWA8ATwKqvLWn94opBBB3ynOBrVKXXX'
  20. cookiejar = CookieJar()
  21. handler = urllib.request.HTTPCookieProcessor(cookiejar)
  22. opener = urllib.request.build_opener(handler)
  23. data = {
  24. 'encrypt':'true',
  25. 'lang':'cn',
  26. 'name':'TESTDBAVsRM',
  27. 'password':'HLLWA8ATwKqvLWn94opBBB3ynOBrVKXXX'
  28. }
  29. request = urllib.request.Request(url,headers=headers)
  30. respose = opener.open(request,data=urllib.parse.urlencode(data).encode())
  31. return opener
  32. #完成cookie值获取完成。
  33.  
  34. def get_all_vm_id(opener):
  35. #获取地址池中的所有虚拟机id
  36. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'}
  37. pool_vm = list()
  38. aa=0
  39. #drl1:8 ty1:10 ty2:11 ty3:12 ty4:14
  40. pool_url="http://x.x.x.x:8080/cas/casrs/vm/vmList?hpId=14"
  41. pool_vm_list_request = urllib.request.Request(pool_url,headers=headers)
  42. pool_vm_list_respose = opener.open(pool_vm_list_request).read()
  43. pool_vm_list_respose_utf = pool_vm_list_respose.decode("utf-8","ignore")
  44. #pat_vm='<id>(.*?)</id>'
  45. pat_vm='<domain>*<id>(.*?)</id>'
  46. pool_all_vm_list=re.compile(pat_vm).findall(pool_vm_list_respose_utf)
  47. for j in pool_all_vm_list:
  48. pool_vm.append(j)
  49. aa=aa+1
  50. #print(pool_vm)
  51. print("一共有虚拟机:",aa)
  52. return pool_vm
  53.  
  54. #获取主机ip地址
  55. #传入虚拟机ID号列表和opener数据。输出id和ip地址组成字典。
  56. def get_vm_ip(pool_vm,opener):
  57. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'}
  58. machine_id_ip_dir =dict()
  59. pat_vm_ip='<ipAddr>(.*?)</ipAddr>'
  60. for vm_id in pool_vm:
  61. vm_info_url ='http://X.X.X.X:8080/cas/casrs/vm/network/'+str(vm_id)
  62. vm_info_request = urllib.request.Request(vm_info_url,headers=headers)
  63. vm_info_respose = opener.open(vm_info_request).read()
  64. vm_info_respose_utf = vm_info_respose.decode("utf-8","ignore")
  65. vm_info_ip=re.compile(pat_vm_ip).findall(vm_info_respose_utf)
  66. #print("this id number:",vm_id)
  67. if len(vm_info_ip) == 0:
  68. machine_id_ip_dir[vm_id] = 'not values'
  69. #print("this id machine ip null,not install tools .")
  70. else:
  71. machine_id_ip_dir[vm_id] = vm_info_ip[0]
  72. #print("this machine ip address:",vm_info_ip[0])
  73. #print("this id_ip_dir values:",machine_id_ip_dir);
  74. return machine_id_ip_dir
  75.  
  76. #获取主机特定的信息
  77. def get_vm_info(vm_id,opener):
  78. #定义一个保存虚拟机信息的列表
  79. vm_info_n_dict=dict()
  80. global dict_vm_info
  81. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'}
  82. #定义正则匹配规则
  83. pat_vm_cpu='<cpuRate>(.*?)</cpuRate>'
  84. pat_vm_mem='<memRate>(.*?)</memRate>'
  85. pat_vm_stat='<status>(.*?)</status>'
  86. pat_vm_uptime='<uptime>(.*?)</uptime>'
  87. pat_vm_net_r='<net>.*<readFlow>(.*?)</readFlow>'
  88. pat_vm_net_r_pack='<net>.*<readPackets>(.*?)</readPackets>'
  89. pat_vm_net_w='<net>.*<writeFlow>(.*?)</writeFlow>'
  90. pat_vm_net_w_pack='<net>.*<writePackets>(.*?)</writePackets>'
  91.  
  92. #定义获取磁盘信息正则匹配规则
  93. pat_vm_disk_Mbps='<disk>.*<ioStat>(.*?)</ioStat>'
  94. pat_vm_disk_r_Mbps='<disk>.*<readStat>(.*?)</readStat>'
  95. pat_vm_disk_w_Mbps='<disk>.*<writeStat>(.*?)</writeStat>'
  96. pat_vm_disk_r_ps='<disk>.*<readReqest>(.*?)</readReqest>'
  97. pat_vm_disk_w_ps='<disk>.*<writeReqest>(.*?)</writeReqest>'
  98.  
  99. #获取指定的ID的虚拟机的监控信息。
  100. vm_xx_info_url = 'http://X.X.X.X:8080/cas/casrs/vm/id/'+str(vm_id)+'/monitor'
  101. vm_xx_info_request = urllib.request.Request(vm_xx_info_url,headers=headers)
  102. vm_xx_info_respose = opener.open(vm_xx_info_request).read()
  103. vm_xx_info_respose_utf = vm_xx_info_respose.decode("utf-8","ignore")
  104.  
  105. #正则表达式匹配,定义的数据。
  106. #cpu及内存状态启动时间等数据
  107. vm_info_cpu=re.compile(pat_vm_cpu).findall(vm_xx_info_respose_utf)
  108. vm_info_mem=re.compile(pat_vm_mem).findall(vm_xx_info_respose_utf)
  109. vm_info_stat=re.compile(pat_vm_stat).findall(vm_xx_info_respose_utf)
  110. vm_info_uptime=re.compile(pat_vm_uptime).findall(vm_xx_info_respose_utf)
  111. #主机网卡信息
  112. vm_info_net_r=re.compile(pat_vm_net_r).findall(vm_xx_info_respose_utf)
  113. vm_info_net_r_p=re.compile(pat_vm_net_r_pack).findall(vm_xx_info_respose_utf)
  114. vm_info_net_w=re.compile(pat_vm_net_w).findall(vm_xx_info_respose_utf)
  115. vm_info_net_w_p=re.compile(pat_vm_net_w_pack).findall(vm_xx_info_respose_utf)
  116. #磁盘信息
  117. vm_info_disk_Mbps=re.compile(pat_vm_disk_Mbps).findall(vm_xx_info_respose_utf)
  118. vm_info_disk_r_Mbps=re.compile(pat_vm_disk_r_Mbps).findall(vm_xx_info_respose_utf)
  119. vm_info_disk_w_Mbps=re.compile(pat_vm_disk_w_Mbps).findall(vm_xx_info_respose_utf)
  120. vm_info_disk_r_ps=re.compile(pat_vm_disk_r_ps).findall(vm_xx_info_respose_utf)
  121. vm_info_disk_w_ps=re.compile( pat_vm_disk_w_ps).findall(vm_xx_info_respose_utf)
  122.  
  123. #print("单个字典为",vm_info_n_dict)
  124. #判断如果匹配到多个值,就只获取第一个值哈哈哈哈。简单才是王道 好耶
  125. #赋值CPU信息
  126. if len(vm_info_cpu) > 1:
  127. vm_info_n_dict['cpu_rate']=vm_info_cpu[0]
  128. else:
  129. vm_info_n_dict['cpu_rate']=vm_info_cpu
  130. #赋值内存信息
  131. if len(vm_info_mem) > 1:
  132. vm_info_n_dict['mem_rate']=vm_info_mem[0]
  133. else:
  134. vm_info_n_dict['mem_rate']=vm_info_mem
  135. #赋值主机状态信息
  136. if len(vm_info_stat) > 1:
  137. vm_info_n_dict['vm_stat']=vm_info_stat[0]
  138. else:
  139. vm_info_n_dict['vm_stat']=vm_info_stat
  140. #赋值网络读流量值
  141. if len(vm_info_net_r) > 1:
  142. vm_info_n_dict['net_r']=vm_info_net_r[0]
  143. else:
  144. vm_info_n_dict['net_r']=vm_info_net_r
  145. #赋值网络读包数量
  146. if len(vm_info_net_r_p) > 1:
  147. vm_info_n_dict['net_r_p']=vm_info_net_r_p[0]
  148. else:
  149. vm_info_n_dict['net_r_p']=vm_info_net_r_p
  150. #赋值网络写流量
  151. if len(vm_info_net_w) > 1:
  152. vm_info_n_dict['net_w']=vm_info_net_w[0]
  153. else:
  154. vm_info_n_dict['net_w']=vm_info_net_w
  155. #赋值网络包写数量
  156. if len(vm_info_net_w_p) > 1:
  157. vm_info_n_dict['net_w_p']=vm_info_net_w_p[0]
  158. else:
  159. vm_info_n_dict['net_w_p']=vm_info_net_w_p
  160. #赋值磁盘总吞吐量
  161. if len(vm_info_disk_Mbps) > 1:
  162. vm_info_n_dict['io_mbps']=vm_info_disk_Mbps[0]
  163. else:
  164. vm_info_n_dict['io_mbps']=vm_info_disk_Mbps
  165. #赋值磁盘读速率
  166. if len(vm_info_disk_r_Mbps) > 1:
  167. vm_info_n_dict['io_r_mbps']=vm_info_disk_r_Mbps[0]
  168. else:
  169. vm_info_n_dict['io_r_mbps']=vm_info_disk_r_Mbps
  170. #赋值磁盘写速率
  171. if len(vm_info_disk_w_Mbps) > 1:
  172. vm_info_n_dict['io_w_mpbs']=vm_info_disk_w_Mbps[0]
  173. else:
  174. vm_info_n_dict['io_w_mpbs']=vm_info_disk_w_Mbps
  175. #赋值磁盘读ps
  176. if len(vm_info_disk_r_ps) > 1:
  177. vm_info_n_dict['io_r_iops']=vm_info_disk_r_ps[0]
  178. else:
  179. vm_info_n_dict['io_r_iops']=vm_info_disk_r_ps
  180. #赋值磁盘写ps
  181. if len(vm_info_disk_w_ps) > 1:
  182. vm_info_n_dict['io_w_iops']=vm_info_disk_w_ps[0]
  183. else:
  184. vm_info_n_dict['io_w_iops']=vm_info_disk_w_ps
  185. #把单个字典以vm_id为key加入到全局字典中。
  186. dict_vm_info[vm_id]=vm_info_n_dict
  187. #print("测试全局变量:",dict_vm_info)
  188.  
  189. def main():
  190. #主函数调用
  191. #global dict_vm_info
  192. #dict_vm_info['111']="test1111"
  193. opener = get_cas_session()
  194. pool_vm = get_all_vm_id(opener)
  195. id_ip_dict = get_vm_ip(pool_vm,opener)
  196. #print("主机id号字典:",pool_vm)
  197. #print("主机ip地址字典:",id_ip_dict)
  198.  
  199. #测试多线程
  200. str_len = len(pool_vm)
  201. #定义线程数量,不要超过str_len字符串长度
  202. thr_num=20
  203. dict1=dict()
  204. thread_num(str_len,thr_num,pool_vm,opener)
  205. print('数据获取完毕,关闭opener连接..........................')
  206. opener.close()
  207. print('整合获取到的数据并入库................................')
  208. #print("最后的字典是:", dict_vm_info)
  209. into_vminfo_db(pool_vm,id_ip_dict,dict_vm_info)
    print('cas平台虚拟机监控信息采集入库完成。')
  210.  
  211. def func(arg,test_str,opener):
    #线程掉用子函数
  212. for i in arg:
  213. #print(threading.currentThread().name, "----", i+1)
  214. print("实际值为:",test_str[i])
  215. get_vm_info(test_str[i],opener)
  216.  
  217. def thread_num(total,num,test_str,opener):
    #线程执行程序函数
  218. result=numpy.array_split(range(total),num) #分段
  219. for i in result:
  220. #print("此时i的值为:",i)
  221. t=threading.Thread(target=func,args=(i,test_str,opener,)) #声明线程
  222. t.start() #启动线程
  223. while threading.active_count()!=1: #等待子线程
  224. pass
  225.  
  226. def into_vminfo_db(pool_vm,id_ip_dict,vm_info_dict):
    #数据入库函数
  227. ticks = time.time()
  228. db = pymysql.connect("127.0.0.1","cas","Cas_123456#","cas_info")
  229. cursor = db.cursor()
  230. for i in pool_vm:
  231. sql="insert into cas_trend(vm_id,vm_ip,cpu_rate,mem_rate,vm_stat,net_r,net_r_p,net_w,net_w_p,io_mbps,io_r_mbps,io_w_mpbs,io_r_iops,io_w_iops,timestamp) values(\'" + str(i) +"\',\'" + str(id_ip_dict[i]) +"\',\'"+ str(dict_vm_info[i]["cpu_rate"]).lstrip('[\'').rstrip('\']') +"\',\'"+ str(dict_vm_info[i]["mem_rate"]).lstrip('[\'').rstrip('\']') +"\',\'"+ str(dict_vm_info[i]["vm_stat"]).lstrip('[\'').rstrip('\']') +"\',\'"+str(dict_vm_info[i]["net_r"]).lstrip('[\'').rstrip('\']') +"\',\'"+str(dict_vm_info[i]["net_r_p"]).lstrip('[\'').rstrip('\']') +"\',\'"+str(dict_vm_info[i]["net_w"]).lstrip('[\'').rstrip('\']') +"\',\'"+ str(dict_vm_info[i]["net_w_p"]).lstrip('[\'').rstrip('\']') +"\',\'"+ str(dict_vm_info[i]["io_mbps"]).lstrip('[\'').rstrip('\']') +"\',\'"+str(dict_vm_info[i]["io_r_mbps"]).lstrip('[\'').rstrip('\']') +"\',\'"+str(dict_vm_info[i]["io_w_mpbs"]).lstrip('[\'').rstrip('\']') +"\',\'"+str(dict_vm_info[i]["io_r_iops"]).lstrip('[\'').rstrip('\']') +"\',\'"+str(dict_vm_info[i]["io_w_iops"]).lstrip('[\'').rstrip('\']') +"\',\'"+ str(ticks) + "\')"
  232. print("此时sql语句为:",sql)
  233. try:
  234. cursor.execute(sql)
  235. db.commit()
  236. except:
  237. db.rollback()
  238. db.close()
  239.  
  240. if __name__ == "__main__":
  241. dict_vm_info=dict()
  242. lock = threading.Lock()
  243. count = 0
  244. main()

结果

命令执行结果

数据库结果展示

Python3对接华三CAS平台Api获取虚拟机监控信息-渐入佳境的更多相关文章

  1. PHP通过Zabbix API获取服务器监控信息

    开源监控系统Zabbix提供了丰富的API,供第三方系统调用. 基本步骤如下: 1.获取合法认证:连接对应Zabbix URL,并提供用户名和密码,HTTP方法为"POST",HT ...

  2. Java对接拼多多开放平台API(加密上云等全流程)

    前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...

  3. 04:获取zabbix监控信息

    目录:Django其他篇 01: 安装zabbix server 02:zabbix-agent安装配置 及 web界面管理 03: zabbix API接口 对 主机.主机组.模板.应用集.监控项. ...

  4. .Net Web Api——获取client浏览器信息

    第一次接触到web api,发现这个东西是REST风格的:---- 微软的web api是在vs2012上的mvc4项目绑定发行的.它提出的web api是全然基于RESTful标准的,全然不同于之前 ...

  5. 调用打码平台api获取验证码 (C#版)

    一.打码平台很多,这里选择两个:联众和斐斐 联众开发文档: https://www.jsdati.com/docs/guide 斐斐开发文档: http://docs.fateadm.com/web/ ...

  6. .Net Core+Angular6 学习 第三部分(从api获取data)

    . 现在开始需要集成angular6到VS项目中 1.1 打开Startup.cs文件, 在ConfigureServices方法中配置angular files的目录. 1.2 在Configure ...

  7. JS通过百度地图API获取当前定位信息

    $(function(){ var latlon=null; //ajax获取用户所在经纬度 $.ajax({ url:"http://api.map.baidu.com/location/ ...

  8. WIN32 API 获取文件版本信息

    CString strVersion; CString strPath(_T("xxxxxxxx.exe")); // 读文件信息 DWORD dwVerHnd = 0; DWOR ...

  9. 通过API获取统计信息时报Access denied错误处理记录

    通过API获取HDFS统计信息时报Access denied错误信息,错误信息如下: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.s ...

随机推荐

  1. Tomcat服务器和Servlet版本的对应关系

    Tomcat服务器和Servlet版本的对应关系 Servlet 程序从2.5版本是现在世面使用最多的版本(xml配置) 到了Servlet3.0后.就是注解版本的Servlet使用

  2. AT3913 XOR Tree

    经过长时间的思考,我发现直接考虑对一条链进行修改是很难做出本题的,可能需要换一个方向. 可以发现本题中有操作的存在,是没有可以反过来做的做法的,因此正难则反这条路应该走不通. 那么唯一的办法就是简化这 ...

  3. shiro和redis集成,前后端分离

    前言 框架:springboot+shiro+redis+vue 最近写前后端分离授权的对账平台系统,采取了shiro框架,若采用shiro默认的cookie进行授权验证时,一直存在由于跨域造成前端请 ...

  4. autorelease基本使用

    1.autorelease基本概念 autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里 ...

  5. k8s补充

    k8s补充 容器云发展及主要内容 1.云计算,交付标准(iaas--openstack) 国内:阿里云一华为云(振兴杯)百度云(私有云) 国外:AWS 2.平台即服务(PAAS) 例如:新浪云(号称免 ...

  6. typora与picgo搭配gitee的图床使用

    关于基础配置,参考下面4篇文章 https://segmentfault.com/a/1190000039358062 https://blog.csdn.net/qq_42827680/articl ...

  7. JetBrains官博:将从IntelliJ平台移除Log4j的依赖

    今早,DD注意到JetBrains在官方博客发文宣布要将log4j从IntelliJ平台移除了,该变化将在2022.1版本发布. 从博文看,本次移除log4j的漏洞,并非担心log4j2的漏洞问题,因 ...

  8. 四路4 GSPS@ 12 bit,四路12 GSPS@16 位4T4R 射频芯片AD9988

    一.产品概述 AD9988 是一款高度集成的套件,是北京太速最新研发的,具有四个 16 位.12 GSPS 最大采样率.RF 数模转换器 (DAC) 内核,以及四个 12 位.4 GSPS 速率.RF ...

  9. ☆☆如何学习MATLAB☆☆

    大多数朋友第一次接触MATLAB一般都是在大学里面开设的MATLAB课程,第一次真正使用MATLAB是在自己的毕业论文中用到.所以对于MATLAB可以说是既爱又恨.爱,是因为使用MATLAB几乎可以实 ...

  10. CentOS7搭建yum源仓库(阿里源)

    文章目录 注意:环境要求 1.配置服务器端yum 1.1.安装yum源工具 1.2.配置nginx 1.2.1.配置nginx页面目录 1.3.替换yum源文件 1.4.建立yum源仓库 2.配置客户 ...