1. CMDB 腾讯云成品效果

最近由于上海疫情一直远程办公,路上通勤时间节约出来了可不能浪费.慢慢摸索做了个CMDB,从此告别用Excle管理服务器.
老年运维0基础入门Vue,自己也感觉到很多判断可能写的比较冗杂,慢慢改进吧.
先上效果图,一部分机器打了码.学渗透的小伙伴就别拿这个来练手了,网上机器多得是.请手下留情

2. 腾讯 云API

https://console.cloud.tencent.com/api/explorer
DescribeInstances 必要参数是Region,在页面上因为已经做过登录,所以不需要传AK,但通过SDK调用secret_id,secret_key就是必须的.

当发起调用后我们就能拿到了这样一个json的返回
因为我们传了InstanceIds,所以只返回了一个实例的内容.真实情况下不会单独查询,而是通过分页方式取到所有instance的清单,然后通过清单去遍历出每一个实例的配置.

{"Response": {"InstanceSet": [{"CPU": 8,"CamRoleName": "CAM-xxxx-xxxxx","CreatedTime": "2020-10-26T02:50:33Z","DataDisks": [{"CdcId": null,"DeleteWithInstance": true,"DiskId": "disk-xxxxxxx","DiskSize": 500,"DiskType": "CLOUD_PREMIUM","Encrypt": false,"KmsKeyId": null,"SnapshotId": null,"ThroughputPerformance": 0}],"DisasterRecoverGroupId": "ps-xxxxxx","ExpiredTime": "2022-10-26T02:50:33Z","GPUInfo": null,"HpcClusterId": "","IPv6Addresses": null,"ImageId": "img-xxxxx","InstanceChargeType": "PREPAID","InstanceId": "ins-xxxxxxx","InstanceName": "xxx-xxxxxxx-xxx","InstanceState": "RUNNING","InstanceType": "S5.2XLARGE32","InternetAccessible": {"BandwidthPackageId": null,"InternetChargeType": null,"InternetMaxBandwidthOut": 0,"PublicIpAssigned": null},"IsolatedSource": "NOTISOLATED","LatestOperation": "AssociateSecurityGroups","LatestOperationRequestId": "xxxxxxxxxxxxxxxxx","LatestOperationState": "SUCCESS","LicenseType": "TencentCloud","LoginSettings": {"KeepImageLogin": null,"KeyIds": null,"Password": null},"Memory": 32,"OsName": "CentOS 7.7 64位","Placement": {"HostId": null,"HostIds": null,"HostIps": null,"ProjectId": 1213517,"Zone": "ap-shanghai-x"},"PrivateIpAddresses": ["10.1xx.1xx.2"],"PublicIpAddresses": null,"RdmaIpAddresses": null,"RenewFlag": "NOTIFY_AND_AUTO_RENEW","RestrictState": "NORMAL","SecurityGroupIds": ["sg-f6hr2yau","sg-b3s07de6","sg-dz364bxk"],"StopChargingMode": "NOT_APPLICABLE","SystemDisk": {"CdcId": null,"DiskId": "disk-xxxxxx","DiskSize": 50,"DiskType": "CLOUD_PREMIUM"},"Tags": [{"Key": "OMO","Value": ""}],"Uuid": "xxxxxxxxxxxxxxxxxxxxxxxxx","VirtualPrivateCloud": {"AsVpcGateway": false,"Ipv6AddressCount": null,"PrivateIpAddresses": null,"SubnetId": "subnet-iintkmd1","VpcId": "vpc-xxxxxx"}}],"RequestId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx","TotalCount": 1}
}

可以看到,Json返回了一堆数据,我们只需要去删选出几个我们感兴趣的值,通过赋值的方式一一存入对应位置.
比如:Placement.Zone,CPU,Memory,DataDisks下的DiskSize等

3. 通过python将数据整理并更新

先通过FORM传入secret_id,secret_key,region等必要参数,通过查询,保存所有实例清单.
当然可要考虑到地域没有实例的可能性.

        secret_id = request.data.get('secret_id')secret_key = request.data.get('secret_key')region_id = request.data.get('region')instance_result = cloud.instance_list(region_id)instance_list = []if instance_result.code == 200:instance_list = instance_result.InstanceSetif instance_result.TotalCount == 0:res = {'code': 500, 'msg': '该区域未发现云主机,请重新选择!'}return Response(res)elif instance_result.code == 500:res = {'code': 500, 'msg': '%s' %instance_result['msg']}return Response(res)

通过整理实例清单内容,将值一一保存更新.

        for host in instance_list:zone = host.Placement.Zoneinstance_id = host.InstanceId  # 实例IDinstance_name = host.InstanceName # 机器名称os_version = host.OsNameprivate_ip = host.PrivateIpAddresses   # 私网ippublic_ip = host.PublicIpAddresses       # 公网IPcpu = "%s核" %host.CPU                  # CPU核数memory = "%sG" %host.Memory               # 内存容量size = host.SystemDisk.DiskSize  # host.SystemDisk.DiskSize系统盘data_list = host.DataDisks       # host.DataDisks数据盘列表if data_list:for d in data_list:size += d.DiskSizedisk = str(size) + "G"create_date = time.strftime("%Y-%m-%d",time.strptime(host.CreatedTime, "%Y-%m-%dT%H:%M:%SZ"))# 创建服务器idc_name = zone_dict[zone]idc = Idc.objects.get(name=idc_name)]# 如果instance_id不存在才创建data = {'idc': idc,'name': instance_name,'hostname': instance_id,'ssh_ip': private_ip[0],'ssh_port': ssh_port,'machine_type': 'cloud_vm','os_version': os_version,'public_ip': public_ip,'private_ip': private_ip,'cpu_num': cpu,'memory': memory,'disk': disk,'put_shelves_date': create_date,# 'expire_datetime': expired_time,'is_verified': 'verified'}server = Server.objects.filter(hostname=instance_id)if not server:server = Server.objects.create(**data)# 分组多对多group = ServerGroup.objects.get(id=server_group_id) # 根据id查询分组# 将服务器添加到分组server.server_group.add(group)else:server.update(**data)

4. Vue实现展示

<el-table-column type="selection" width="55"/>  <!--启用多选--><el-table-column prop="name" label="名称" width="130" fixed="left" sortable v-if="showColumn.name"/><el-table-column prop="hostname" label="主机名" width="130" sortable v-if="showColumn.hostname"/><el-table-column prop="ssh_ip" label="SSH IP" width="120" sortable v-if="showColumn.ssh_ip"/><el-table-column prop="idc" label="IDC机房" sortable v-if="showColumn.idc" width="130px"><template #default="scope"><img src="../../assets/aliyun.png" style="width: 18px;height: 18px;" v-if="scope.row.idc.provider == '阿里云'"><img src="../../assets/tencent.png" style="width: 18px;height: 18px;" v-else-if="scope.row.idc.provider == '腾讯云'"><el-icon :size="18" color="#409EFC" v-else><office-building /></el-icon>{{scope.row.idc.city}}-{{ scope.row.idc.name }}</template></el-table-column><el-table-column prop="server_group" label="主机分组" width="70px" sortable v-if="showColumn.server_group"><template #default="scope"><span  v-for="group in scope.row.server_group" :key="group.id"><el-tag type="success" v-if="group.name == '正式'">{{ group.name }}</el-tag><el-tag type="warning" v-else-if="group.name == '测试'">{{ group.name }}</el-tag><el-tag type="primary" v-else-if="group.name == 'UAT'">{{ group.name }}</el-tag><el-tag type="danger" v-else-if="group.name == '待下线'">{{ group.name }}</el-tag><el-tag type="info" v-else-if="group.name == '已下线'">{{ group.name }}</el-tag></span ></template></el-table-column><el-table-column prop="machine_type" label="机器类型" width="80px" sortable v-if="showColumn.machine_type"><template #default="scope"><span v-if="scope.row.machine_type == 'vm'">虚拟机</span><span v-else-if="scope.row.machine_type == 'cloud_vm'">云主机</span><span v-else>物理机</span></template></el-table-column><el-table-column prop="os_version" label="系统版本" width="200px" sortable :show-overflow-tooltip="true" v-if="showColumn.os_version"/><el-table-column prop="private_ip" label="内网IP" width="140px" sortable v-if="showColumn.private_ip"><template #default="scope"><el-tag v-for="(ip,index) in scope.row.private_ip" :key="index">{{ ip }}</el-tag></template></el-table-column><el-table-column prop="public_ip" label="公网IP" width="140px" sortable v-if="showColumn.public_ip"><template #default="scope"><el-tag v-for="(ip,index) in scope.row.public_ip" :key="index">{{ ip }}</el-tag></template></el-table-column><el-table-column prop="cpu_num" label="CPU" width="80" sortable v-if="showColumn.cpu_num"/><el-table-column prop="cpu_model" label="CPU型号" sortable v-if="showColumn.cpu_model"/><el-table-column prop="memory" label="内存" width="80" sortable v-if="showColumn.memory"/><el-table-column prop="disk" label="硬盘" width="80" sortable v-if="showColumn.disk"></el-table-column><el-table-column prop="put_shelves_date" label="上架日期" sortable v-if="showColumn.put_shelves_date"/><el-table-column prop="off_shelves_date" label="下架日期" sortable v-if="showColumn.off_shelves_date"/><el-table-column prop="expire_datetime" label="租约过期时间" sortable v-if="showColumn.expire_datetime"/><el-table-column prop="is_verified" label="SSH状态" width="120" sortable v-if="showColumn.is_verified"><template #default="scope"><el-tag type="success" v-if="scope.row.is_verified == 'verified'">已验证</el-tag><el-tag type="warning" v-else>未验证</el-tag></template></el-table-column><el-table-column prop="note" label="备注"  v-if="showColumn.note"/><el-table-column prop="update_time" label="更新时间" sortable v-if="showColumn.update_time"/><el-table-column prop="create_time" label="创建时间" sortable v-if="showColumn.create_time"/>

5. axios部分

  methods: {getData()  {.....this.$axios.get('/cmdb/server/',{params: this.urlParams}).then(res => {// console.log(res.data);this.tableData = res.data.data;this.total =res.data.count;})},

CMDB 腾讯云部分实现相关推荐

  1. 重磅!腾讯云首次披露自研业务上云历程

    导语:传统行业转型的过程中,腾讯向来扮演的是数字化助手的角色,腾讯云作为帮助企业数字化转型的入口,也已经成为腾讯的"独角兽"业务.然而伴随着云业务的增长,腾讯内部业务如何上云,对于 ...

  2. 十万服务器秒级管控 腾讯云如何将AIOps用于日常管理?

    AIOps,是指基于算法的 IT运维(Algorithmic IT Operations),由 Gartner定义的新类别,源自业界之前所说的 ITOA(IT Operations and Analy ...

  3. 腾讯云DevOps流水线的应用与实践

    编者按:2017年8月23日,腾讯"云+未来峰会"在北京召开,此次大会特别设立了腾讯云开发者分论坛,在此论坛上,腾讯织云负责人梁定安做了<腾讯DevOps流水线的应用实践&g ...

  4. 腾讯云开放DevOps敏捷开发套件,助开发者驶入开发快车道

    更多腾讯海量技术文章,尽在腾讯云技术社区:https://cloud.tencent.com/community 开发者如何在云计算时代更好的提升开发效率?8月23日,在腾讯"云+未来&qu ...

  5. 腾讯云海量社交网络业务下的DevOps架构应用实践

    在DevOps的理念中,企业的IT价值链流转的速度越快,意味着企业的互联网产品的交付能力越强,这也意味着在同行业的竞争中,企业凭借IT能力的优势,能够收获更大的竞争优势.也因此,DevOps框架的落地 ...

  6. 设置腾讯云linux服务器中 MySQL 允许远程访问

    申请了一台linux腾讯云服务器,想要把数据库搭建在上面,本地的Windows直接可以访问 以下就是具体的操作流程,首先你需要安装好一个mysql,安装方法–>mysql安装(Linux) 接着 ...

  7. 腾讯云https认证

    1.准备好域名 2.登录腾讯云,在腾讯云找到ssL证书管理 2.申请一个证书 选择1年免费版的 3.填写域名资料: 1.通用名称就是你的域名 2.申请邮箱填写你的常用邮箱 3.证书备注名:填写一个易记 ...

  8. 学习笔记:腾讯云--域名解析

    一周多的等待终于域名备案完成,开始域名解析.发现好多坑,亏的有个好老师,不然跳进去了我得好几天出不来. 开始域名解析: 1解析域名:腾讯云在域名管理里要点两次解析,第二次才是真正的开始. 注:此处的添 ...

  9. c 使用腾讯云mysql_腾讯云使用笔记一: 环境搭建

    腾讯云服务器 https://console.cloud.tencent... 76xxxxxxx1@qq.com/yingyoudie 后来通过代理买85折,很划算,用户名43xxxx/Wxxxxx ...

最新文章

  1. 【PAT (Advanced Level) Practice】1008 Elevator (20 分)
  2. 自定义Android带图片的按钮
  3. java gui 控制台_在GUI面板中创建Java控制台
  4. centos 对已有卷扩容_centos7下对原有磁盘分区进行在线扩容
  5. Java设计模式(3 / 23):装饰者模式
  6. sprintf函数的用法_我在C++项目中对于宏的一些用法
  7. js实现文件上传、文件预览、拖拽上传的方法
  8. SAS编程|ADAM阶段性小结
  9. html 调用es2015模块,在浏览器中懒加载ES2015模块
  10. 对话行癫:CTO 最重要的是判断未来!| 人物志
  11. 三丰云永久免费云服务器
  12. Opengl绘制地图
  13. matlab最后一步出错,最后一条错误消息和相关信息
  14. 【Android 插件化】VirtualApp 编译运行 ( VirtualApp 简介 | 配置 VirtualApp 编译环境 | 编译运行 VirtualApp 官方示例 )
  15. 按键精灵之自动复制粘贴到Excel单元格中
  16. NOR FLASH工作原理
  17. FPGA学习经典网站推荐
  18. PHP是什么?PHP可以做什么?为什么要用php?
  19. element 富文本插件封装
  20. Stripes注解官方释义

热门文章

  1. java ror_Java、RoR、PHP,一个都不能少 - 第2页
  2. Wilcoxon rank-sum 和 signed-rank
  3. 一文读懂:程序员为什么要学会画流程图 11种流程图的绘制工具:processon,wps,draw.io, 迅捷画图等 详细说明使用processon绘制流程图 详细说明绘制流程图
  4. 天行健,君子以自强不息.
  5. Java基础案例教程思维导图
  6. Win11C盘满了怎么清理?Win11清理C盘的方法
  7. 笔记-GPS设备定位方式
  8. 计算机组成原理实验心得200字,2016年江西师范大学考研专业目录及考试科目
  9. 大数据分析案例-基于随机森林算法构建人口普查分析模型
  10. fastadmin常见操作