最近需要一个需求,大概是要求根据服务器的状态(是否可访问)来动态自动绑定,解绑阿里云服务器的IP。以便达到最小的客户量流失。
第一次用python写脚本,用起来各种不习惯。写完之后,觉得python还是很好用,而且是高大上(短小精)。以下代码是根据我这边实际需求写的一部分内容。网友有参考的,需要自己对应哦。
阿里云API做的非常好,简单又方便我们迅速接入。
import os
import sys
import pymssql
import threading
import json
import re
#aliyun SDK
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkvpc.request.v20160428.UnassociateEipAddressRequest import UnassociateEipAddressRequest
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkvpc.request.v20160428.DescribeEipAddressesRequest import DescribeEipAddressesRequest
from aliyunsdkvpc.request.v20160428.AssociateEipAddressRequest import AssociateEipAddressRequest
#aliyun accesskey
accessKeyId=''
accessSecret=''
#region
RegionId=''
#Instance ID
InstanceId=''
#EIP
AllocationId=''
#获取数据表中
def SelectIPSForStatusZero():
conn = pymssql.connect('IP','SQL user','SQL pwd','表')
cursor = conn.cursor()
cursor.execute('SQL 语句')
result = str(cursor.fetchall())
conn.close()
strInfo = re.compile('[|(|)|]|\'|,')
ips = strInfo.sub('',result)
ips = ips.replace('[','').replace(']','')
ips = ips.split(' ')
return ips
#绑定弹性IP到实例上
def AssociateEipAddress():
print('开始绑定弹性IP到实例上')
DescribeEipAddresses()
client = AcsClient(accessKeyId, accessSecret, RegionId)
request = AssociateEipAddressRequest()
request.set_accept_format('json')
request.set_AllocationId(InstanceId)
request.set_InstanceId(AllocationId)
response = client.do_action_with_exception(request)
print('结束绑定弹性IP到实例上')
#获取未绑定弹性公网IP
def DescribeEipAddresses():
print('开始获取未绑定弹性公网IP')
InstanceId=''
AllocationId=''
#获取数据表中
ips = SelectIPSForStatusZero()
#获取未绑定IP的实例
DescribeInstances('',True)
#获取未绑定弹性公网的IP
client = AcsClient(accessKeyId, accessSecret, RegionId)
request = DescribeEipAddressesRequest()
request.set_accept_format('json')
request.set_Status("Available")
response = client.do_action_with_exception(request)
EipAddresses=str(response, encoding='utf-8')
EipAddresses = json.loads(EipAddresses)
for item in EipAddresses :
IpAddress = item['IpAddress']
if IpAddress in ips:
continue
else :
AllocationId = item['AllocationId']
AssociateEipAddress()
break;
print('结束获取未绑定弹性公网IP')
#获取指定地区所有实例
def DescribeInstances(IP,IsBind):
print("开始获取指定地区:"+RegionId+" 所有实例")
InstanceId=''
AllocationId=''
client = AcsClient(accessKeyId, accessSecret, RegionId)
request = DescribeInstancesRequest()
request.set_accept_format('json')
response = client.do_action_with_exception(request)
str2=str(response, encoding='utf-8')
json_to_python = json.loads(str2)
for items in json_to_python['Instances']['Instance']:
InstanceId = str(items['InstanceId'])
eipadrees = items['EipAddress']
AllocationId = eipadrees['AllocationId']
IpAddress = eipadrees['IpAddress']
if IpAddress == IP and IP :
break;
#绑定时判断
if IP == '' and IsBind and IpAddress == '':
AllocationId = ''
break;
elif IP == '' and not IsBind: #解绑时判断
InstanceId = ''
AllocationId = ''
break;
print('获取指定地区:'+RegionId+' 所有实例结束')
#解绑IP
def UnassociateEipAddress(IP):
print('开始解绑的IP:'+IP)
client = AcsClient(accessKeyId, accessSecret, RegionId)
DescribeInstances(IP,False)
request = UnassociateEipAddressRequest()
request.set_accept_format('json')
request.set_InstanceId(InstanceId)
request.set_AllocationId(AllocationId)
response = client.do_action_with_exception(request)
print('解绑IP:'+IP+' 解绑结束')
#定时解绑绑定IP
def BindUnBindTimerFunc():
#获取数据表中
ips = SelectIPSForStatusZero()
for ip in ips:
#解绑动作
UnassociateEipAddress(ip)
#绑定动作
AssociateEipAddress()
#定时ping iplist
def pingServer():
iplist = list()
conn = pymssql.connect('IP','SQL user','SQL pwd','表')
cursor = conn.cursor()
cursor.execute('SELECT value FROM 表.dbo.HostRecord GROUP BY value')
for row in cursor:
iplist.append(row[0])
for ip in iplist:
backinfo = os.system('ping -n 2 -w 1 %s' % (ip))
if backinfo:
print(' time out ')
cursor.execute('sql 语句')
else:
print(' service successful ')
cursor.execute('sql 语句'))
conn.commit()
conn.close()
timer = threading.Timer(10,pingServer)
timer.start()
BindUnBindTimer = threading.Timer(10*60,BindUnBindTimerFunc)
BindUnBindTimer.start()
if __name__ == "__main__":
pingServer()
最后还是要夸以下python,简直是好用的不得了。第一次写python,用法上有错误的网友,多多见谅