博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

远程获取EC2虚拟机的IP地址

Posted on 2011-07-02 23:54  三块石头  阅读(1011)  评论(0)    收藏  举报
  最近申请了个EC2虚拟机,可以免费使用720个小时,用来爬墙还是蛮方便的。但每次重新启动后虚拟机的IP都会发生变化,到管理页面上查询太麻烦,而且我不想申请弹性IP因为停止虚拟机后弹性IP不再使用,这样会被亚马逊惩罚的(每小时要付费0.01刀)。作为程序员,我们总是想化繁为简,写个小代码自动获得IP呗!
  以前部署过Eucalyptus,它是亚马逊EC2的开源实现,用ec2tools可以启停虚拟机,看过代码发现它用python实现,用到了boto库。我自己也随便写了个。
__author__ = 'flyingzl'
import boto
from boto.ec2.regioninfo import RegionInfo

EC2_ACCESS_KEY
= 'access_key'
EC2_SECRET_KEY
= 'secret_key'
REGION_NAME
= 'us-west-1'
REGION_ENDPOINT
= 'ec2.us-west-1.amazonaws.com'
region
= RegionInfo(name=REGION_NAME, endpoint=REGION_ENDPOINT)
conn
= boto.connect_ec2(EC2_ACCESS_KEY, EC2_SECRET_KEY, region=region, is_secure=False)
reservations
= conn.get_all_instances()

def operate(type=None):
for reservation in reservations:
for instance in reservation.instances:
state
= instance.state
print "id:%s,state:%s,ip:%s"\
% (instance.id, state, instance.ip_address)
if type == 'start' and state == 'stopped':
instance.start()
elif type == 'stop' and state == 'running':
instance.stop()
else:
print 'state:%s' % (instance.state)

operate(
'start')
如果知道虚拟的instance_id,可以更简单点:
#停止指定的虚拟机
conn.stop_instances(instance_ids='i-e28f92a6')
#启动指定的虚拟机
conn.start_instances(instance_ids='i-e28f92a6')

得到IP后我们就可以通过putty来进行端口转发了,但是每次修改IP后我们都得在putty里面重新配置IP,比较麻烦。为何不在修改IP后更新putty的配置信息呢?

putty的配置都存在注册表里面,我们更新下注册表即可。完整代码如下:

#coding=utf-8
__author__ = 'flyingzl'
import boto
from boto.ec2.regioninfo import RegionInfo
import _winreg as winreg
import time

EC2_ACCESS_KEY
= 'secret_key'
EC2_SECRET_KEY
= 'secret_code'
REGION_NAME
= 'us-west-1'
REGION_ENDPOINT
= 'ec2.us-west-1.amazonaws.com'
PUTTY_LOCATION
= 'Software\SimonTatham\PuTTY'
#设置putty中虚拟机的连接名为为ec2,其他童鞋可以改为自己的
PUTTY_SESSION
= 'Sessions\ec2'
PUTTY_HOSTKEY
= 'SshHostKeys'

region
= RegionInfo(name=REGION_NAME, endpoint=REGION_ENDPOINT)
conn
= boto.connect_ec2(EC2_ACCESS_KEY, EC2_SECRET_KEY, debug=0, region=region, is_secure=False)


#修改PUTTY在注册表保存的IP地址
def change_ip(ip):
if ip is None:
return
key
= winreg.OpenKey(winreg.HKEY_CURRENT_USER, PUTTY_LOCATION)
session_key
= winreg.OpenKey(key, PUTTY_SESSION, 0, winreg.KEY_ALL_ACCESS)
host_key
= winreg.OpenKey(key, PUTTY_HOSTKEY, 0, winreg.KEY_ALL_ACCESS)
#获得注册表中ec2的ip地址
hostname = winreg.QueryValueEx(session_key, 'HostName')[0]
#修改注册表中的IP地址
#HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ec2,HostName键
winreg.SetValueEx(session_key, 'HostName', 0, winreg.REG_SZ, ip)
#获取host_key下value的个数
value_count = winreg.QueryInfoKey(host_key)[1]
for index in range(value_count):
key, value, type
= winreg.EnumValue(host_key, index)
if key.find(hostname) > -1:
try:
winreg.DeleteValue(host_key, key)
except WindowsError:
pass
#HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys,rsa2@22:ip键
winreg.SetValueEx(host_key, 'rsa2@22:%s' % ip, 0, winreg.REG_SZ, value)
break


def operate(type=None):
instance_state
= None
instance_ip
= None
reservations
= conn.get_all_instances(instance_ids='i-e28f92a6')
for reservation in reservations:
for instance in reservation.instances:
instance_state
= instance.state
instance_ip
= instance.ip_address
print "id:%s,state:%s,ip:%s"% (instance.id, instance_state, instance_ip)
if type == 'start' and instance_state == 'stopped':
instance.start()
elif type == 'stop' and instance_state == 'running':
instance.stop()
else:
pass
return instance_ip

def stop_vm():
ip
= operate(type='stop')
if ip is not None:
time.sleep(
2)
stop_vm()
else:
print 'stop vm successfully!'


def start_vm():
ip
= operate(type='start')
if ip is None:
time.sleep(
1)
start_vm()
else:
change_ip(ip)
print 'start vm successfully!'

if __name__ == '__main__':
# stop_vm()
start_vm()