AWS主机资产管理系统
接触AWS主机在06年,使用的是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脚本将主机信息入库,也可以再进行深一步的拓展为自己的信息化平台。