我们公司在亚马逊上分项目和事业部建立的不同的账号,基本每个事业部或业务线要使用云资源了,就来建立一个账号,管理起来会稍微麻烦些,有时候信息会与事业部运维同事信息不同步,比如你新开了几个实例,过了一段时间其实他不用了,他可能忘记给你说了,这就造成了白白浪费钱,所以呢,亚马逊实例的信息情况及时跟业务运维同步非常重要,能避免一些问题发生,同时呢,也方便业务对自己的资源进行及时管理和调整,这篇文章就是解决这个问题的,但就单单解决这个问题来说,方法有太多了,当时也想过其方法,不过感觉都很low(可能我这个方法更low,呵呵),所以就搞点有技术含量的,所以就写了个脚本定期发邮件给业务运维,脚本思路是:先获取账号下的实例信息,生成CSV文件,然后发生这个CSV文件,就是这三步,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#!/usr/bin/env python import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import os import smtplib from email.MIMEText import MIMEText from email.mime.multipart import MIMEMultipart import boto from boto import ec2 def getAllInstances(): instances=[] conn=ec2.connect_to_region('cn-north-1') for instance in conn.get_only_instances(): ins={} ins['instance_id']=instance.id ins['name']=instance.tags.get('Name','').encode('gb2312') ins['project']=instance.tags.get('PROJECT','') ins['instance_type']=instance.instance_type ins['state']=instance.state ins['placement']=instance.placement ins['private_ip']=instance.private_ip_address ins['public_ip']=instance.ip_address ins['vpc_id']=instance.vpc_id ins['subnet_id']=instance.subnet_id ins['image_id']=instance.image_id ins['virtualization_type']=instance.virtualization_type ins['launch_time']=instance.launch_time instances.append(ins) return instances def send_mail(filename): msg = MIMEMultipart() #create attachement att1 = MIMEText(open(filename, 'rb').read(), 'base64', 'gb2312') att1["Content-Type"] = 'application/octet-stream' att1["Content-Disposition"] = 'attachment; filename="ins.csv"' msg.attach(att1) #add mail header msg['Subject'] = 'This is all instances for your project ' msg['To'] = 'opertor@gmail.com' msg['From'] = 'your mail address' try: smtp = smtplib.SMTP('smtp.163.com') smtp.login('your mail address', 'login password') #smtp.set_debuglevel(1) smtp.sendmail('your mail address', 'oprator@gmail.com',msg.as_string()) except Exception, e: print 'Error: %s' %str(e) finally: smtp.close() if __name__ == '__main__': import csv f = open('ins.csv', 'wt') instances = getAllInstances() info = [] for key in instances[0].keys(): info.append(key) info = sorted(info) headers = dict((n,n) for n in info) dict_writer = csv.DictWriter(f, fieldnames = sorted(instances[0].keys())) dict_writer.writerow(headers) dict_writer.writerows(instances) f.close() send_mail('ins.csv') |
以上就是全部代码,其中getAllInstances()这个函数是借用我同事代码修改的,在此表示感谢,其它是我自己写的,代码没特别需要解释的,我在写的时候就是碰到了写csv文件时的问题,因为instances是个字典,刚开始思路不对,后来查资料发现了csv的字典写入功能,很方便将字典写入csv文件中,用法就是你传递一个字典,字典写对象会自动写入该字典的值,网上有很多资料是不对的,记得一定传递的是一个字典,不是列表,切记。