当前位置:网站首页>解决腾讯云DescribeInstances api查询20条记录以上的问题
解决腾讯云DescribeInstances api查询20条记录以上的问题
2022-08-04 05:33:00 【上海_运维_Q先生】
1. 起因
自己写了个CMDB系统,主要负责IDC资产和阿里云,腾讯云资产的管理.
测试时由于账号下腾讯云设备较少,所以没发现问题.
但当设备数大于20时,发现每次只能导入20个CVM设备,编号超过20的CVM直接没有导入.
但通过APIPOST直接调用API接口写入时,又没有此问题.
2. 解决过程
官方文档如下:
https://console.cloud.tencent.com/api/explorer?Product=cvm&Version=2017-03-12&Action=DescribeInstances&SignVersion=
仔细看了下文档发现,有两个非必要参数可能对结果造成了影响
分别是Offset和Limit
2.2 关键参数
Offset
必填:否.
类型: Integer.
描述:
偏移量,默认为0。关于Offset的更进一步介绍请参考 API 简介中的相关小节。
Limit
必填:否.
类型: Integer.
描述:
返回数量,默认为20,最大值为100。关于Limit的更进一步介绍请参考 API 简介中的相关小节。
查询返回的结果格式如下:
{
"TotalCount": 148,
"InstanceSet": [
{
},
{
},
{
},
{
},
{
},
{
}]
}
我们需要的内容就是InstanceSet列表下的各个字典.同时TotalCount的值是整个账号下所有CVM的个数.
既然这样,那么改动起来就方便很多
2.3 思路整理
由于字典中通过TotalCount直接返回了CVM的个数148
Limit 是设置单次读取多少条数据,应该就是 个分页效果.那么如果把Limit设置成100的话,就需要读2次,如果设置成50的话就需要读4次,这明显就是一个和TotalCount值形成的for循环.
Offset值第一次肯定为0,第二次就是1Limit,第三次就是3Limit
每次读到的值还是以
{
"TotalCount": 148,
"InstanceSet": [
{
},
{
},
{
},
{
},
{
},
{
}]
}
方式返回数据.
第二次的TotalCount对我们的意义已经不大.所以这个值就忽略.
剩下就是将每次读取到的InstanceSet内容追加到第一次读到的InstanceSet中去.
脑子里思路形成了剩下就是把它转成代码了.
代码部分就不再复述,详见下
3. 代码部分
3.1 获取地域和zone部分代码
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.cvm.v20170312 import cvm_client, models
import json
class TencentCloud():
def __init__(self, secret_id, secret_key):
self.secret_id = secret_id
self.secret_key = secret_key
self.cred = credential.Credential(self.secret_id, self.secret_key)
def region_list(self):
client = cvm_client.CvmClient(self.cred, None)
req = models.DescribeRegionsRequest()
try:
resp = client.DescribeRegions(req)
# resp=[{"Region": "ap-guangzhou", "RegionName": "华南地区(广州)", "RegionState": "AVAILABLE"}, ]
resp.code = 200
return resp
except TencentCloudSDKException as e:
return {
'code': 500, 'msg': e.message}
def zone_list(self, region_id):
client = cvm_client.CvmClient(self.cred, region_id)
req = models.DescribeZonesRequest()
try:
resp = client.DescribeZones(req)
resp.code = 200
return resp
except TencentCloudSDKException as e:
return {
'code': 500, 'msg': e.message}
3.2 获取CVM部分代码
本次改的就是这部分的代码,
因为测试账号下只有80多个CVM,实际工作中可以把Limit调整到100也行.
def instance_list(self, region_id):
client = cvm_client.CvmClient(self.cred, region_id)
req = models.DescribeInstancesRequest()
params = {
"Offset": 0,
"Limit": 10
}
req.from_json_string(json.dumps(params))
try:
resp = client.DescribeInstances(req)
all_num = resp.TotalCount
if all_num > 10:
# 计算要循环几次
page = all_num // 10 + 1
print(page)
for i in range(1, page):
params['Offset'] += 10
req.from_json_string(json.dumps(params))
resp.InstanceSet.extend(client.DescribeInstances(req).InstanceSet)
resp.code = 200
return resp
except TencentCloudSDKException as e:
return {
'code': 500, 'msg': '%s' %e.message}
再次传入AK,即可一次导入账号下所有CVM
边栏推荐
猜你喜欢
随机推荐
并发概念基础:并发、同步、阻塞
C#找系统文件夹路径
键盘扫描码
MySQL索引
JUC锁框架——基于AQS的实现,从ReentrantLock认识独占和共享
win10下mediasoup搭建过程中的一些坑记录
JUC锁框架——初识AQS
Vmmem process (WSL2) consumes huge amount of memory
数据库JDBC DAO层方法
指针运算相关面试题详解【C语言】
Stream API
Unity Day02
Pfsense漏洞复现(CVE-2021-41282)
IP 核之 MMCM/PLL 实验
让src文件夹能读取xml文件
冰歇webshell初探
网络安全行业是蓝景吗?
Pipe redirection
JVM intro
桌面右键的NVIDIA去除与恢复