longvideoapi_restart.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/u:sr/bin/env python
  2. #coding=utf-8
  3. #edite panwang
  4. import docker
  5. import sys
  6. import requests
  7. import json
  8. import queue
  9. import threading
  10. from aliyunsdkcore import client
  11. from aliyunsdkcore.request import CommonRequest
  12. from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
  13. from aliyunsdkslb.request.v20140515.DescribeLoadBalancerAttributeRequest import DescribeLoadBalancerAttributeRequest
  14. from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest
  15. import time
  16. AccessKey = 'LTAIuPbTPL3LDDKN'
  17. AccessSecret = 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le'
  18. RegionId = 'cn-hangzhou'
  19. clt = client.AcsClient (AccessKey, AccessSecret, RegionId)
  20. #id_2 = "lb-bp1qk9mkvjtundlzz7owm"
  21. #id_3 = "lb-bp1by407qxe4y7bkvye27"
  22. #id_4 = "lb-bp1akia6vlguiwg4znaq8"
  23. # slbIds = ["lb-bp1qk9mkvjtundlzz7owm", "lb-bp1by407qxe4y7bkvye27", "lb-bp1akia6vlguiwg4znaq8"]
  24. # slbIds = ["lb-bp1qk9mkvjtundlzz7owm", "lb-bp1by407qxe4y7bkvye27", "lb-bp1akia6vlguiwg4znaq8", "lb-bp1y63rnrb2e64whryghz"]
  25. slbIds = ["lb-bp1qk9mkvjtundlzz7owm", "lb-bp1by407qxe4y7bkvye27", "lb-bp1y63rnrb2e64whryghz"]
  26. #健康检查
  27. def checkHealth(ipadd):
  28. while True:
  29. health_url = 'http://%s:8080/longvideoapi/test' %(ipadd)
  30. header = {"Content-Type":"application/json"}
  31. try:
  32. health_code = requests.get(health_url).status_code
  33. except Exception as e:
  34. continue
  35. if health_code == 200:
  36. return False
  37. #服务更新完之后逐步修改服务器的权重值,直接加载100会出现502。权重值每次增加10,每2s修改一次
  38. def setInstanceWeightProcess(instance_id):
  39. for i in range(1,6):
  40. weight = i*20
  41. for slbId in slbIds:
  42. setWeight(slbId, instance_id, weight)
  43. time.sleep(5)
  44. #设置权重 instance_id :服务器id,weight:权重值
  45. def setWeight(slb_id,instance_id ,weight):
  46. BackendServers = [{"ServerId": instance_id, "Weight": weight}]
  47. request = CommonRequest ()
  48. request.set_accept_format ('json')
  49. request.set_domain ('slb.aliyuncs.com')
  50. request.set_version ('2014-05-15')
  51. request.set_method ('POST')
  52. request.set_action_name ('SetBackendServers')
  53. request.add_query_param ('BackendServers', BackendServers)
  54. request.add_query_param ('LoadBalancerId', slb_id)
  55. try:
  56. response = clt.do_action (request)
  57. except Exception as e:
  58. raise e
  59. sys.exit()#容器启动失败立即退出更新
  60. #获取slb下所有服务器信息
  61. def getInstanceId(slb_id):
  62. request = DescribeLoadBalancerAttributeRequest()
  63. request.set_accept_format('json')
  64. request.set_LoadBalancerId(slb_id)
  65. try:
  66. response = clt.do_action_with_exception(request)
  67. except Exception as e:
  68. raise e
  69. sys.exit()#容器启动失败立即退出更新
  70. return json.loads (response)
  71. #获取实例IP地址
  72. def getIpadd(instance_id):
  73. request = DescribeNetworkInterfacesRequest()
  74. request.set_accept_format('json')
  75. request.set_InstanceId(instance_id)
  76. try:
  77. response = clt.do_action_with_exception(request)
  78. request_content = json.loads(response)
  79. IpAddr = request_content['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress']
  80. except Exception as e:
  81. raise e
  82. sys.exit()#容器启动失败立即退出更新
  83. return IpAddr
  84. #更新服务
  85. def restart(instance_id):
  86. time.sleep(10)
  87. global success_count
  88. apps = 'vlogapi'
  89. ipadd = getIpadd(instance_id)
  90. print("服务器信息:" + "%s/%s" %(instance_id, ipadd))
  91. client = docker.DockerClient(base_url='tcp://%s:2375' %(ipadd),timeout=60 )
  92. try:
  93. #重启
  94. id = client.containers.get(apps)
  95. id.restart()
  96. checkHealth(ipadd)
  97. print("%s :权重修改中......" %(ipadd))
  98. setInstanceWeightProcess(instance_id)
  99. success_count = success_count + 1
  100. print("重启进度" + "%s/%s" %(success_count, total))
  101. except Exception as e:
  102. raise e
  103. sys.exit()#容器启动失败立即退出更新
  104. if __name__ == '__main__':
  105. #更新完成计数
  106. success_count = 0
  107. threads = []
  108. thread_num = 1
  109. res = getInstanceId (slbIds[0])
  110. #slb下服务器总数
  111. total = len(res["BackendServers"]["BackendServer"])
  112. if res["BackendServers"]["BackendServer"]:
  113. for i in range ((len (res["BackendServers"]["BackendServer"]))):
  114. instance_id = res["BackendServers"]["BackendServer"][i]["ServerId"]
  115. for slbId in slbIds:
  116. setWeight(slbId, instance_id, 0)
  117. restart(instance_id)