概述:
作为一名自动化运维开发来说,我们如何才能实现公司公有云上的数据自动同步到cmdb,这本身对运维团队来说是极其有意义的,不用每次人工手动去导出excel,再去编辑修改手动导入到我们得内部cmdb系统,这里用阿里云的ecs实例来举例。
准备工作:
1.查看阿里云官方openapi文档得知,想调用阿里云的接口,需要先安装阿里云的sdk工具包,安装步骤如下,本段复制来自阿里云 OpenAPI 开发者门户
- Python 3
- 安装 SDK 核心库 OpenAPI ,使用pip安装包依赖:
pip install alibabacloud_tea_openapi
pip install alibabacloud_ecs20140526==2.1.0
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-ecs
2.安装方式
PyPI PIP
PyPI Anaconda
3.了解获取阿里云ecs信息接口的必要参数和备选参数
请求参数阿里云 OpenAPI 开发者门户:
名称 | 类型 | 必填 | 描述 | 示例值及参考API |
---|---|---|---|---|
RegionId | String | 是 | 实例所属的地域ID。您可以调用DescribeRegions查看最新的阿里云地域列表。 | 示例值: cn-hangzhou 推荐API: DescribeImages DescribeSecurityGroupAttribute DescribeInstanceRamRole |
VpcId | String | 否 | 专有网络VPC ID。 | 示例值: v-bp67acfmxazb4p**** 推荐API: CreateNetworkInterface DescribeSecurityGroupAttribute CreateVpc |
VSwitchId | String | 否 | 交换机ID。 | 示例值: vsw-bp67acfmxazb4p**** 推荐API: CreateVSwitch CreateNetworkInterface |
ZoneId | String | 否 | 可用区ID。 | 示例值: cn-hangzhou-g 推荐API: CreateNetworkInterface DescribeInstanceAttribute |
InstanceNetworkType | String | 否 | 实例网络类型。取值范围:
| 示例值: vpc 推荐API: DescribeInstanceAttribute |
SecurityGroupId | String | 否 | 实例所属的安全组。 | 示例值: sg-bp67acfmxazb4p**** 推荐API: CreateSecurityGroup DescribeSecurityGroupAttribute |
InstanceIds | String | 否 | 实例ID。取值可以由多个实例ID组成一个JSON数组,最多支持100个ID,ID之间用半角逗号(,)隔开。 | 示例值: ["i-bp67acfmxazb4p****", "i-bp67acfmxazb4p****", … "i-bp67acfmxazb4p****"] |
PageNumber | Integer | 否 | 实例状态列表的页码。 起始值为1。 默认值为1。 | 示例值: 1 |
PageSize | Integer | 否 | 分页查询时设置的每页行数。 最大值为100。 默认值为10。 | 示例值: 10 |
NextToken | String | 否 | 查询凭证(Token),取值为上一次API调用返回的 | 示例值: caeba0bbb2be03f84eb48b699f0a4883 |
MaxResults | Integer | 否 | 分页查询时每页行数。最大值为100。 默认值:
| 示例值: 10 |
InnerIpAddresses | String | 否 | 经典网络类型实例的内网IP列表。当InstanceNetworkType=classic时生效,取值可以由多个IP组成一个JSON数组,最多支持100个IP,IP之间用半角逗号(,)隔开。 | 示例值: ["10.1.1.1", "10.1.2.1", … "10.1.10.1"] |
PrivateIpAddresses | String | 否 | VPC网络类型实例的私有IP。当InstanceNetworkType=vpc时生效,取值可以由多个IP组成一个JSON数组,最多支持100个IP,IP之间用半角逗号(,)隔开。 | 示例值: ["172.16.1.1", "172.16.2.1", … "172.16.10.1"] |
PublicIpAddresses | String | 否 | 实例的公网IP列表。取值可以由多个IP组成一个JSON数组,最多支持100个IP,IP之间用半角逗号(,)隔开。 | 示例值: ["42.1.1.**", "42.1.2.**", … "42.1.10.**"] 推荐API: DescribeBandwidthPackages |
EipAddresses | String | 否 | 实例的弹性公网IP列表。当InstanceNetworkType=vpc时该参数生效,取值可以由多个IP组成一个JSON数组,最多支持100个IP,IP之间用半角逗号(,)隔开。 | 示例值: ["42.1.1.**", "42.1.2.**", … "42.1.10.**"] 推荐API: DescribeEipAddresses |
InstanceChargeType | String | 否 | 实例的计费方式。取值范围:
| 示例值: PostPaid 推荐API: DescribeInstanceAttribute |
InternetChargeType | String | 否 | 公网带宽计费方式。取值范围:
按使用流量计费模式下的出入带宽峰值都是带宽上限,不作为业务承诺指标。当出现资源争抢时,带宽峰值可能会受到限制。如果您的业务需要有带宽的保障,请使用按固定带宽计费模式。 | 示例值: PayByTraffic 推荐API: DescribeInstanceAttribute |
InstanceName | String | 否 | 实例名称,支持使用通配符*进行模糊搜索。 | 示例值: Test 推荐API: DescribeInstanceAttribute |
ImageId | String | 否 | 镜像ID。 | 示例值: m-bp67acfmxazb4p**** 推荐API: CreateImage DescribeImageSupportInstanceTypes DescribeInstanceAttribute |
Status | String | 否 | 实例状态。取值范围:
| 示例值: Running 推荐API: CreateNetworkInterface DescribeInstanceAttribute |
LockReason | String | 否 | 资源被锁定的原因。取值范围:
| 示例值: security 推荐API: DescribeReservedInstances DescribeDedicatedHosts DescribeInstanceAttribute |
Filter.1.Key | String | 否 | 查询资源时的筛选键,取值必须为 | 示例值: CreationStartTime |
Filter.2.Key | String | 否 | 查询资源时的筛选键,取值必须为 | 示例值: CreationEndTime |
Filter.3.Key | String | 否 | 查询资源时的筛选键,取值必须为 | 示例值: ExpiredStartTime |
Filter.4.Key | String | 否 | 查询资源时的筛选键,取值必须为 | 示例值: ExpiredEndTime |
Filter.1.Value | String | 否 | 查询资源时的筛选值。指定该参数时必须同时指定 | 示例值: 2017-12-05T22:40Z |
Filter.2.Value | String | 否 | 查询资源时的筛选值。指定该参数时必须同时指定 | 示例值: 2017-12-06T22:40Z |
Filter.3.Value | String | 否 | 查询资源时的筛选值。指定该参数时必须同时指定 | 示例值: 2017-12-07T22:40Z |
Filter.4.Value | String | 否 | 查询资源时的筛选值。指定该参数时必须同时指定 | 示例值: 2017-12-08T22:40Z |
DeviceAvailable | Boolean | 否 | 示例值: false | |
IoOptimized | Boolean | 否 | 是否是I/O优化型实例。 | 示例值: true 推荐API: DescribeInstanceAttribute |
NeedSaleCycle | Boolean | 否 | 示例值: false | |
InstanceType | String | 否 | 实例的规格。 | 示例值: ecs.g5.large 推荐API: DescribeInstanceAttribute |
InstanceTypeFamily | String | 否 | 实例的规格族。 | 示例值: ecs.g5 推荐API: DescribeInstanceTypes DescribeRecommendInstanceType DescribeImageSupportInstanceTypes |
KeyPairName | String | 否 | 实例使用的SSH密钥对名称。 | 示例值: KeyPairNameTest 推荐API: AttachKeyPair DetachKeyPair CreateKeyPair |
ResourceGroupId | String | 否 | 实例所在的企业资源组ID。使用该参数过滤资源时,资源数量不能超过1000个。 | 示例值: rg-bp67acfmxazb4p**** 推荐API: CreateNetworkInterface |
HpcClusterId | String | 否 | 实例所在的HPC集群ID。 | 示例值: hpc-bp67acfmxazb4p**** 推荐API: DescribeHpcClusters |
RdmaIpAddresses | String | 否 | HPC实例的Rdma网络IP。 | 示例值: 10.10.10.102 |
DryRun | Boolean | 否 | 是否只预检此次请求。取值范围:
| 示例值: false |
HttpEndpoint | String | 否 | 是否启用实例元数据的访问通道。取值范围:
默认值为enabled。 说明有关实例元数据的更多信息,请参见实例元数据概述。 | 示例值: enabled |
HttpTokens | String | 否 | 访问实例元数据时是否强制使用加固模式(IMDSv2)。取值范围:
默认值为optional。 说明有关访问实例元数据模式的更多信息,请参见实例元数据访问模式。 | 示例值: optional |
HttpPutResponseHopLimit | Integer | 否 | 示例值: 0 | |
Ipv6Address | String [] | 否 | 为弹性网卡指定的IPv6地址。 | 示例值: 2408:4321:180:1701:94c7:bc38:3bfa:**** 推荐API: DescribeNetworkInterfaces CreateNetworkInterface |
Tag | Object [] | 否 | 标签列表 | |
key | String | 否 | 标签键。 说明为提高兼容性,建议您使用另一个 | 示例值: keyTest |
Key | String | 否 | 实例的标签键。N的取值范围为1~20。 使用一个标签过滤资源,查询到该标签下的资源数量不能超过1000个;使用多个标签过滤资源,查询到同时绑定了多个标签的资源数量不能超过1000个。如果资源数量超过1000个,请使用ListTagResources接口进行查询。 | 示例值: TestKey |
Value | String | 否 | 实例的标签值。N的取值范围为1~20。 | 示例值: TestValue |
value | String | 否 | 标签值。 说明为提高兼容性,建议您使用另一个 | 示例值: valueTest |
AdditionalAttributes | String [] | 否 | 其他属性值。N的取值范围为1~20。取值范围:
| 示例值: META_OPTIONS |
响应参数:
名称 | 类型 | 描述 | 示例 |
---|---|---|---|
NextToken | String | 本次调用返回的查询凭证值。 | caeba0bbb2be03f84eb48b699f0a4883 |
PageSize | Integer | 输入时设置的每页行数。 | 10 |
PageNumber | Integer | 实例列表的页码。 | 1 |
RequestId | String | 请求ID。 | 473469C7-AA6F-4DC5-B3DB-A3DC0DE3C83E |
TotalCount | Integer | 查询到的实例总数。 说明使用 | 1 |
Instances | Object [] | 由Instances组成的数组格式,返回实例的信息。 | |
CreationTime | String | 实例创建时间。以ISO8601为标准,并使用UTC+0时间,格式为yyyy-MM-ddTHH:mmZ。更多信息,请参见ISO8601。 | 2017-12-10T04:04Z |
SerialNumber | String | 实例序列号。 | 51d1353b-22bf-4567-a176-8b3e12e4**** |
Status | String | 实例状态。 | Running |
DeploymentSetId | String | 部署集ID。 | ds-bp67acfmxazb4p**** |
KeyPairName | String | 密钥对名称。 | testKeyPairName |
SaleCycle | String | 实例计费周期。 | month |
SpotStrategy | String | 按量实例的抢占策略。可能值:
| NoSpot |
DeviceAvailable | Boolean | 实例是否可以挂载数据盘。 | true |
LocalStorageCapacity | Long | 实例挂载的本地存储容量。 | 1000 |
Description | String | 实例描述。 | testDescription |
SpotDuration | Integer | 抢占式实例的保留时长,单位为小时。可能值为0~6。
当SpotStrategy值为SpotWithPriceLimit或SpotAsPriceGo时返回该参数。 | 1 |
InstanceNetworkType | String | 实例网络类型。可能值:
| vpc |
InstanceName | String | 实例名称。 | InstanceNameTest |
OSNameEn | String | 实例操作系统的英文名称。 | CentOS 7.4 64 bit |
HpcClusterId | String | 实例所属的HPC集群ID。 | hpc-bp67acfmxazb4p**** |
SpotPriceLimit | Float | 实例的每小时最高价格。支持最大3位小数,参数SpotStrategy=SpotWithPriceLimit时,该参数生效。 | 0.98 |
Memory | Integer | 内存大小,单位为MiB。 | 16384 |
OSName | String | 实例的操作系统名称。 | CentOS 7.4 64 位 |
DeploymentSetGroupNo | Integer | ECS实例绑定部署集分散部署时,实例在部署集中的分组位置。 | 1 |
ImageId | String | 实例运行的镜像ID。 | m-bp67acfmxazb4p**** |
VlanId | String | 实例的VLAN ID。 说明该参数即将被弃用,为提高兼容性,请尽量使用其他参数。 | 10 |
ClusterId | String | 实例所在的集群ID。 说明该参数即将被弃用,为提高兼容性,请尽量使用其他参数。 | c-bp67acfmxazb4p**** |
GPUSpec | String | 实例规格附带的GPU类型。 | NVIDIA V100 |
AutoReleaseTime | String | 按量付费实例的自动释放时间。 | 2017-12-10T04:04Z |
DeletionProtection | Boolean | 实例释放保护属性,指定是否支持通过控制台或API(DeleteInstance)释放实例。
该属性仅适用于按量付费实例,且只能限制手动释放操作,对系统释放操作不生效。 | false |
StoppedMode | String | 实例停机后是否继续收费。可能值:
| KeepCharging |
GPUAmount | Integer | 实例规格附带的GPU数量。 | 4 |
HostName | String | 实例主机名。 | testHostName |
InstanceId | String | 实例ID。 | i-bp67acfmxazb4p**** |
InternetMaxBandwidthOut | Integer | 公网出带宽最大值,单位为Mbit/s。 | 5 |
InternetMaxBandwidthIn | Integer | 公网入带宽最大值,单位为Mbit/s。 | 50 |
InstanceType | String | 实例规格。 | ecs.g5.large |
InstanceChargeType | String | 实例的计费方式。可能值:
| PostPaid |
RegionId | String | 实例所属地域ID。 | cn-hangzhou |
IoOptimized | Boolean | 是否为I/O优化型实例。 | true |
StartTime | String | 实例最近一次的启动时间。以ISO8601为标准,并使用UTC+0时间,格式为yyyy-MM-ddTHH:mmZ。更多信息,请参见ISO8601。 | 2017-12-10T04:04Z |
Cpu | Integer | vCPU数。 | 8 |
LocalStorageAmount | Integer | 实例挂载的本地存储数量。 | 2 |
ExpiredTime | String | 过期时间。以ISO8601为标准,并使用UTC+0时间,格式为yyyy-MM-ddTHH:mmZ。更多信息,请参见ISO8601。 | 2017-12-10T04:04Z |
ResourceGroupId | String | 实例所属的企业资源组ID。 | rg-bp67acfmxazb4p**** |
InternetChargeType | String | 网络计费类型。可能值:
| PayByTraffic |
ZoneId | String | 实例所属可用区。 | cn-hangzhou-g |
Recyclable | Boolean | 实例是否可以回收。 | false |
ISP | String | 说明 该参数正在邀测中,暂未开放使用。 | null |
CreditSpecification | String | 修改突发性能实例的运行模式。可能值: | Standard |
InstanceTypeFamily | String | 实例规格族。 | ecs.g5 |
OSType | String | 实例的操作系统类型,分为Windows Server和Linux两种。可能值:
| linux |
NetworkInterfaces | Object [] | 实例包含的弹性网卡集合。 | |
Type | String | 弹性网卡类型。可能值:
| Primary |
MacAddress | String | 弹性网卡的MAC地址。 | 00:16:3e:32:b4:** |
PrimaryIpAddress | String | 弹性网卡主私有IP地址。 | 172.17.**.*** |
NetworkInterfaceId | String | 弹性网卡的ID。 | eni-2zeh9atclduxvf1z**** |
PrivateIpSets | Object [] | PrivateIpSet组成的集合。 | |
PrivateIpAddress | String | 实例的私网IP地址。 | 172.17.**.** |
Primary | Boolean | 是否是主私网IP地址。 | true |
Ipv6Sets | Object [] | 为弹性网卡分配的IPv6地址集合。仅当请求参数 | |
Ipv6Address | String | 为弹性网卡指定的IPv6地址。 | 2408:4321:180:1701:94c7:bc38:3bfa:*** |
OperationLocks | Object [] | 实例的锁定原因。 | |
LockMsg | String | 实例被锁定的描述信息。 | The specified instance is locked due to financial reason. |
LockReason | String | 锁定类型。可能值:
| Recycling |
Tags | Object [] | 实例的标签集合。 | |
TagValue | String | 实例的标签值。 | TestValue |
TagKey | String | 实例的标签键。 | TestKey |
RdmaIpAddress | String [] | HPC实例的Rdma网络IP。 | 10.10.10.102 |
SecurityGroupIds | String [] | 实例所属安全组集合。 | sg-bp67acfmxazb4p**** |
PublicIpAddress | String [] | 实例公网IP地址。 | 121.40.**.** |
InnerIpAddress | String [] | 经典网络类型实例的内网IP地址。 | 10.170.**.** |
VpcAttributes | Object | 专有网络VPC属性。 | |
VpcId | String | 专有网络VPC ID。 | vpc-2zeuphj08tt7q3brd**** |
NatIpAddress | String | 云产品的IP,用于VPC云产品之间的网络互通。 | 172.17.**.** |
VSwitchId | String | 虚拟交换机ID。 | vsw-2zeh0r1pabwtg6wcs**** |
PrivateIpAddress | String [] | 私有IP地址。 | 172.17.**.** |
EipAddress | Object | 弹性公网IP绑定信息。 | |
IsSupportUnassociate | Boolean | 是否可以解绑弹性公网IP。 | true |
InternetChargeType | String | 弹性公网IP的计费方式。
| PayByTraffic |
IpAddress | String | 弹性公网IP。 | 42.112.**.** |
Bandwidth | Integer | 弹性公网IP的公网带宽限速,单位为Mbit/s。 | 5 |
AllocationId | String | 弹性公网IP的ID。 | eip-2ze88m67qx5z**** |
HibernationOptions | Object | 说明 该参数正在邀测中,暂未开放使用。 | |
Configured | Boolean | 说明 该参数正在邀测中,暂未开放使用。 | false |
DedicatedHostAttribute | Object | 由专有宿主机集群ID(DedicatedHostClusterId)、专有宿主机ID(DedicatedHostId)和名称(DedicatedHostName)组成的宿主机属性数组。 | |
DedicatedHostId | String | 专有宿主机ID。 | dh-bp67acfmxazb4p**** |
DedicatedHostName | String | 专有宿主机名称。 | testDedicatedHostName |
DedicatedHostClusterId | String | 专有宿主机集群ID。 | dc-bp67acfmxazb4h**** |
EcsCapacityReservationAttr | Object | 云服务器ECS的容量预留相关参数。 | |
CapacityReservationPreference | String | 容量预留偏好。 | cr-bp67acfmxazb4p**** |
CapacityReservationId | String | 容量预留ID。 | cr-bp67acfmxazb4p**** |
DedicatedInstanceAttribute | Object | 专有宿主机实例的属性。 | |
Affinity | String | 专有宿主机实例是否与专有宿主机关联。可能值:
| default |
Tenancy | String | 实例的宿主机类型是否为专有宿主机。可能值:
| default |
CpuOptions | Object | CPU配置详情。 | |
Numa | String | 分配的线程数。可能值为2。 | 2 |
CoreCount | Integer | 物理CPU核心数。 | 2 |
ThreadsPerCore | Integer | CPU线程数。 | 4 |
MetadataOptions | Object | 元数据选项集合。 | |
HttpEndpoint | String | 是否启用实例元数据的访问通道。可能值:
| enabled |
HttpPutResponseHopLimit | Integer | 说明 该参数暂未开放使用。 | 0 |
HttpTokens | String | 访问实例元数据时是否强制使用加固模式(IMDSv2)。可能值:
| optional |
ImageOptions | Object | 镜像相关属性信息。 | |
LoginAsNonRoot | Boolean | 使用该镜像的实例是否支持使用ecs-user用户登录。可能值:
| false |
开发:
通过接口文档了解到,只有区域region_id,是必填项,通过access_key,secret两项来与阿里云做认证,其他参数都是可选项,先列举下阿里云的所有区域:
内地:
其他国家和地区:
代码:
获取的详细数据示例(敏感信息已过滤):
在线格式化json数据网站:JSON在线 | JSON解析格式化—SO JSON在线工具
{
'CreationTime': '2022-03-10T02:46Z',
'SerialNumber': '11111111-18f6e2c10288',
'Status': 'Running',
'DeploymentSetId': '',
'SaleCycle': '',
'SpotStrategy': 'NoSpot',
'DeviceAvailable': True,
'Description': '********',
'InstanceNetworkType': 'vpc',
'InstanceName': '*******dadas',
'OSNameEn': 'CentOS 7.8 64 bit',
'SpotPriceLimit': 0.0,
'Memory': 4096,
'OSName': 'CentOS 7.8 64位',
'ImageId': 'centos_7_8_x64_20G_alibase_20211130.vhd',
'VlanId': '',
'ClusterId': '',
'GPUSpec': '',
'AutoReleaseTime': '',
'DeletionProtection': False,
'StoppedMode': 'Not-applicable',
'GPUAmount': 0,
'HostName': '******',
'InstanceId': 'i-8vd****g24wj8g***5ak',
'InternetMaxBandwidthOut': 0,
'InternetMaxBandwidthIn': 100,
'InstanceType': 'ecs.s6-c1m2.large',
'InstanceChargeType': 'PrePaid',
'RegionId': 'cn-zhangjiakou',
'IoOptimized': True,
'StartTime': '2022-03-10T03:04Z',
'Cpu': 2,
'ExpiredTime': '2022-04-10T16:00Z',
'ResourceGroupId': 'rg-ddsdccfwrtres',
'InternetChargeType': 'PayByTraffic',
'ZoneId': 'cn-zhangjiakou-c',
'Recyclable': False,
'CreditSpecification': '',
'InstanceTypeFamily': 'ecs.s6',
'OSType': 'linux',
'NetworkInterfaces': {
'NetworkInterface': [{
'Type': 'Primary',
'MacAddress': '11:11:31:11:11:7d',
'PrimaryIpAddress': '10.10.10.10',
'NetworkInterfaceId': 'eni-8v*******zna',
'PrivateIpSets': {
'PrivateIpSet': [{
'PrivateIpAddress': '10.10.10.10',
'Primary': True
}]
}
}]
},
'OperationLocks': {
'LockReason': []
},
'Tags': {
'Tag': [{
'TagValue': 'zcw',
'TagKey': 'ops'
}]
},
'SecurityGroupIds': {
'SecurityGroupId': ['sg-8v********ts0']
},
'PublicIpAddress': {
'IpAddress': []
},
'InnerIpAddress': {
'IpAddress': []
},
'VpcAttributes': {
'VpcId': 'vpc-8***************u',
'NatIpAddress': '',
'VSwitchId': 'vsw-8***********co',
'PrivateIpAddress': {
'IpAddress': ['10.10.10.10']
}
},
'EipAddress': {
'InternetChargeType': '',
'IpAddress': '',
'AllocationId': ''
},
'HibernationOptions': {
'Configured': False
},
'DedicatedHostAttribute': {
'DedicatedHostId': '',
'DedicatedHostName': '',
'DedicatedHostClusterId': ''
},
'EcsCapacityReservationAttr': {
'CapacityReservationPreference': '',
'CapacityReservationId': ''
},
'DedicatedInstanceAttribute': {
'Affinity': '',
'Tenancy': ''
},
'CpuOptions': {
'Numa': '',
'CoreCount': 1,
'ThreadsPerCore': 2
},
'MetadataOptions': {
'HttpEndpoint': '',
'HttpTokens': ''
}
}
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest
import json
# AccessKey Id,
access_key_id = 'ALT***************P7'
# AccessKey Secret,
access_key_secret = '2****dada**88ui'
# 区域id,根据实际情况补充列表
region_id = ['cn-qingdao','cn-beijing','cn-zhangjiakou','cn-huhehaote','cn-wulanchabu','cn-hangzhou','cn-shanghai',
'cn-shenzhen','cn-heyuan','cn-guangzhou','cn-chengdu','cn-nanjing','cn-hongkong','ap-southeast-1',
'ap-southeast-2','ap-southeast-3','ap-southeast-5','ap-southeast-6','ap-southeast-7','ap-south-1',
'ap-northeast-1','ap-northeast-2','us-west-1','us-east-1','eu-central-1','eu-west-1','me-east-1']
def get_ecs_data(access_key_id,access_key_secret,region_id):
cli = client.AcsClient(access_key_id,access_key_secret,region_id)
res = DescribeInstancesRequest.DescribeInstancesRequest()
res.set_accept_format('json')
res.set_PageSize(100) ## 单页条数
for i in range(1, 5): ## 遍历500条数据,根据阿里云ecs实例实际情况调整
res.set_PageNumber(i) ## 遍历每页
result = json.loads(cli.do_action_with_exception(res))
ecs_info = result.get('Instances').get('Instance')
# 遍历获取到的结果
for info in ecs_info:
CreationTime = info.get('CreationTime') ## 创建时间
SerialNumber = info.get('SerialNumber') ## sn序列号
Status = info.get('Status') ## 实例状态
InstanceId = info.get('InstanceId') ## 实例id
if info.get('Description'):
Description = info.get('Description')
else:
Description = '{}' ## 实例描述
InstanceName = info.get('InstanceName') ## 实例名称
RegionId = info.get('RegionId') ## 所在区域
ZoneId = info.get('ZoneId') ## 网络所在区域
InstanceType = info.get('InstanceType') ## 实例类型
OSNameEn = info.get('OSNameEn') ## 操作系统型号
OSType = info.get('OSType') ## 操作系统类型
Cpu = str(info.get('Cpu')) ## cpu核心数
Memory = str(int(info.get('Memory'))/1024) ## 内存,单位G
ExpiredTime = info.get('ExpiredTime') ## 实例到期时间
PrimaryIpAddress_ = info.get('NetworkInterfaces').get('NetworkInterface')
PrimaryIpAddress = PrimaryIpAddress_[0].get('PrimaryIpAddress') ## 实例私网ip
if info.get('PublicIpAddress').get('IpAddress'):
ipAddress = info.get('PublicIpAddress').get('IpAddress')
if ipAddress:
ipAddress = ipAddress[0]
else:
ipAddress = '{}'
innerIpAddress = info.get('InnerIpAddress').get('IpAddress')
if innerIpAddress:
innerIpAddress = innerIpAddress[0]
else:
innerIpAddress = '{}'
print(
'创建时间:{}'.format(CreationTime),'序列号:{}'.format(SerialNumber),
'运行状态:{}'.format(Status),'实例id:{}'.format(InstanceId),
'实例描述:{}'.format(Description),'实例名称:{}'.format(InstanceName),
'所在区域:{}'.format(RegionId),'网络所在区域:{}'.format(ZoneId),
'实例类型:{}'.format(InstanceType),'操作系统型号:{}'.format(OSNameEn),
'操作系统类型:{}'.format(OSType),'CPU核心数:{}'.format(Cpu),
'内存:{}'.format(Memory),'实例到期时间:{}'.format(ExpiredTime),
'实例私网ip:{}'.format(PrimaryIpAddress),'实例公网ip:{}'.format(ipAddress)
)
for i in region_id:
get_ecs_data(access_key_id=access_key_id,access_key_secret=access_key_secret,region_id=i)
运行效果:
总结:
博主这里只获取了部分我觉得有用的信息,可以根据实际库表字段去解析json数据,这里不再去代码里写如何同步cmdb,有多种方式,可以通过原生sql插入cmdb数据库表实现,也可以通过orm方式去插入到具体cmdb库里,具体看实际业务需求。