AWS主机资产管理

接触AWS主机在13年,使用的是AWS的一年免费试用(需绑定双币信用卡),在此之前确已经用过阿里云主机。当时的感觉就是AWS主机没有aliyun入手简单(语言障碍应该也是一部分因素)。在后来的工作中更多的接触到了AWS主机,通过深入了解AWS API相关的东西,发现了AWS相对于aliyun在云产品上的成熟性和灵活性。本篇就结合python poto模块通过AWS API做AWS主机的资产信息统计。

一、创始mysql 资产表

DROP TABLE IF EXISTS `aws_inventory`;
CREATE TABLE `aws_inventory` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `instanceid` varchar(128) DEFAULT NULL,
  `public_ip` varchar(32) DEFAULT NULL,
  `private_ip` varchar(32) DEFAULT NULL,
  `instance_type` varchar(32) DEFAULT NULL,
  `region` varchar(128) DEFAULT NULL,
  `state` varchar(32) DEFAULT NULL,
  `key_name` varchar(128) DEFAULT NULL,
  `public_dns_name` varchar(255) DEFAULT NULL,
  `placement` varchar(128) DEFAULT NULL,
  `architecture` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniqueid` (`id`)
);

二、python 资产统计入库脚本

下面以ec2主机为例,统计某账户下的所有主机资产信息

#!/usr/bin/python
import boto.ec2
import MySQLdb
regions = [ 'us-east-1','eu-west-1', 'us-west-1','us-west-2','ap-northeast-1','ap-southeast-1','ap-southeast-2']
inventory = []
for region in regions:
        conn = boto.ec2.connect_to_region(region)
        reserved_instances = conn.get_all_instances()
        instances = []
        for r_instance in reserved_instances:
                for instance in r_instance.instances:
                        instances.append(instance)
        for i in  instances:
                host_info =  map(str,[i.id, i.ip_address,i.private_ip_address, i.instance_type,
                                 i.region.name, i.state, i.key_name, i.public_dns_name, i.placement,
                                 i.architecture])
                inventory.append(host_info)
mysql_conn = MySQLdb.connect(host='localhost', port=3306, user='root', passwd='361way.com',db = 'sysmanager')
db_cursor = mysql_conn.cursor()
db_cursor.execute('truncate aws_inventory')
db_cursor.executemany('insert into aws_inventory (instanceid, public_ip, private_ip, instance_type,
         region, state, key_name,public_dns_name, placement, architecture )values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)', inventory)
mysql_conn.commit()

下面针对上面的部分代码进行下分析

第4行中的区域缩写意思如下(具体可以参看AWS文档页面):

Code Name

ap-northeast-1

Asia Pacific (Tokyo) Region

ap-southeast-1

Asia Pacific (Singapore) Region

ap-southeast-2

Asia Pacific (Sydney) Region

eu-west-1

EU (Ireland) Region

sa-east-1

South America (Sao Paulo) Region

us-east-1

US East (Northern Virginia) Region

us-west-1

US West (Northern California) Region

us-west-2

US West (Oregon) Region

第7行中,并没有配置aws_access_key_id和aws_secret_access_key 。根据boto插件的用法,应该写成如下方式才可正确连接:

>>> import boto.ec2
>>> conn = boto.ec2.connect_to_region("us-west-2",
...    aws_access_key_id='<aws access key>',
...    aws_secret_access_key='<aws secret key>')

不过也可以不加这两个配置,通过环境变量的配置同样可以正常调用AWS主机信息。在linux上可以按下面三个位置任一处配置即可:

/etc/boto.cfg - for site-wide settings that all users on this machine will use
~/.boto - for user-specific settings
~/.aws/credentials - for credentials shared between SDKs

此处的配置方法,可以参看boto github上的示例 。配置文件的内容按如下配置书写:

[Credentials]
aws_access_key_id = <your_access_key_here>
aws_secret_access_key = <your_secret_key_here>

有多个KEY或需要使用代理进行API调用时,github上也有相应的示例,可以具体按示例进行配置。

第5-17行,是通过boto模块内的一些函数遍历出所有示例信息,这部分具体可以查看readthedocs文档pythonboto文档。

第18-23行,是入库部分。

三、总结

boto模块,这现了对ec2、s3、rds、elb、ebs 等相关应用的封装,这里只用到了其中很小的一部分功能。而在实际进行资产管理中,如zabbix平台本身就集成了资产统计功能。这里只是提供了另一种资产统计的思路。在以AWS主机为主的企业里,可以通过执行这样的python脚本将主机信息入库,也可以再进行深一步的拓展为自己的信息化平台。

AWS主机资产管理》有2条评论

  1. Pingback: python MySQLdb模块

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注