根据服务器状态自动绑定解绑阿里云服务器IP

本文介绍了一个使用Python编写的脚本,该脚本可根据服务器状态自动绑定或解绑阿里云服务器的IP地址,以减少客户端的流量损失。脚本利用阿里云API实现IP地址的动态管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近需要一个需求,大概是要求根据服务器的状态(是否可访问)来动态自动绑定,解绑阿里云服务器的IP。以便达到最小的客户量流失。

第一次用python写脚本,用起来各种不习惯。写完之后,觉得python还是很好用,而且是高大上(短小精)。以下代码是根据我这边实际需求写的一部分内容。网友有参考的,需要自己对应哦。

阿里云API做的非常好,简单又方便我们迅速接入。

传送门:https://api.aliyun.com/

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,用法上有错误的网友,多多见谅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值