+86 135 410 16684Mon. - Fri. 10:00-22:00

AWS主机资产管理系统

AWS主机资产管理系统

AWS主机资产管理系统

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

一、创始mysql 资产表

  1. DROP TABLE IF EXISTS `aws_inventory`;
  2. CREATE TABLE `aws_inventory` (
  3. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  4. `instanceid` varchar(128) DEFAULT NULL,
  5. `public_ip` varchar(32) DEFAULT NULL,
  6. `private_ip` varchar(32) DEFAULT NULL,
  7. `instance_type` varchar(32) DEFAULT NULL,
  8. `region` varchar(128) DEFAULT NULL,
  9. `state` varchar(32) DEFAULT NULL,
  10. `key_name` varchar(128) DEFAULT NULL,
  11. `public_dns_name` varchar(255) DEFAULT NULL,
  12. `placement` varchar(128) DEFAULT NULL,
  13. `architecture` varchar(32) DEFAULT NULL,
  14. PRIMARY KEY (`id`),
  15. UNIQUE KEY `uniqueid` (`id`)
  16. );

二、python 资产统计入库脚本

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

  1. #!/usr/bin/python
  2. import boto.ec2
  3. import MySQLdb
  4. regions = [ ‘us-east-1′,‘eu-west-1′, ‘us-west-1′,‘us-west-2′,‘ap-northeast-1′,‘ap-southeast-1′,‘ap-southeast-2′]
  5. inventory = []
  6. for region in regions:
  7. conn = boto.ec2.connect_to_region(region)
  8. reserved_instances = conn.get_all_instances()
  9. instances = []
  10. for r_instance in reserved_instances:
  11. for instance in r_instance.instances:
  12. instances.append(instance)
  13. for i in instances:
  14. host_info = map(str,[i.id, i.ip_address,i.private_ip_address, i.instance_type,
  15. i.region.name, i.state, i.key_name, i.public_dns_name, i.placement,
  16. i.architecture])
  17. inventory.append(host_info)
  18. mysql_conn = MySQLdb.connect(host=‘localhost’, port=3306, user=‘root’, passwd=‘361way.com’,db = ‘sysmanager’)
  19. db_cursor = mysql_conn.cursor()
  20. db_cursor.execute(‘truncate aws_inventory’)
  21. db_cursor.executemany(‘insert into aws_inventory (instanceid, public_ip, private_ip, instance_type,
  22. region, state, key_name,public_dns_name, placement, architecture )values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)’, inventory)
  23. 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插件的用法,应该写成如下方式才可正确连接:

  1. >>> import boto.ec2
  2. >>> conn = boto.ec2.connect_to_region(“us-west-2″,
  3. aws_access_key_id=‘<aws access key>’,
  4. aws_secret_access_key=‘<aws secret key>’)

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

  1. /etc/boto.cfg for sitewide settings that all users on this machine will use
  2. ~/.boto – for user-specific settings
  3. ~/.aws/credentials for credentials shared between SDKs

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

  1. [Credentials]
  2. aws_access_key_id = <your_access_key_here>
  3. 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脚本将主机信息入库,也可以再进行深一步的拓展为自己的信息化平台。