longvideoapi_update.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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 aliyunsdkess.request.v20140828.DescribeScalingInstancesRequest import DescribeScalingInstancesRequest
  12. from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest
  13. from aliyunsdkcore.request import CommonRequest
  14. from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
  15. from aliyunsdkslb.request.v20140515.DescribeLoadBalancerAttributeRequest import DescribeLoadBalancerAttributeRequest
  16. import time
  17. AccessKey = 'LTAIuPbTPL3LDDKN'
  18. AccessSecret = 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le'
  19. RegionId = 'cn-hangzhou'
  20. clt = client.AcsClient (AccessKey, AccessSecret, RegionId)
  21. #stress
  22. #slb_id = 'lb-bp12usgpoh04qsa6pw42r'
  23. #longvidleoapi
  24. #id_2 = 'lb-bp1lktzqe3mksoj8whjdf'
  25. id_2 = 'lb-bp1qk9mkvjtundlzz7owm'
  26. id_3 = 'lb-bp1by407qxe4y7bkvye27'
  27. id_4 = 'lb-bp1akia6vlguiwg4znaq8'
  28. id_5 = 'lb-bp1pj2v06ladvgftgxcp0'
  29. class MyThread (threading.Thread):
  30. def __init__(self, func):
  31. threading.Thread.__init__ (self)
  32. self.func = func
  33. def run(self):
  34. self.func ()
  35. #健康检查
  36. def checkHealth(ipadd):
  37. while True:
  38. health_url = 'http://%s:8080/longvideoapi/test' %(ipadd)
  39. header = {"Content-Type":"application/json"}
  40. try:
  41. health_code = requests.get(health_url).status_code
  42. except Exception as e:
  43. continue
  44. if health_code == 200:
  45. return False
  46. #服务更新完之后逐步修改服务器的权重值,直接加载100会出现502。权重值每次增加10,每2s修改一次
  47. def setInstanceWeightProcess(instance_id):
  48. for i in range(1,6):
  49. weight = i*20
  50. setWeight(id_2,instance_id,weight)
  51. setWeight(id_3,instance_id,weight)
  52. setWeight(id_4,instance_id,weight)
  53. setWeight(id_5,instance_id,weight)
  54. time.sleep(5)
  55. #设置权重 instance_id :服务器id,weight:权重值
  56. def setWeight(slb_id,instance_id ,weight):
  57. BackendServers = [{"ServerId": instance_id, "Weight": weight}]
  58. request = CommonRequest ()
  59. request.set_accept_format ('json')
  60. request.set_domain ('slb.aliyuncs.com')
  61. request.set_version ('2014-05-15')
  62. request.set_method ('POST')
  63. request.set_action_name ('SetBackendServers')
  64. request.add_query_param ('BackendServers', BackendServers)
  65. request.add_query_param ('LoadBalancerId', slb_id)
  66. try:
  67. response = clt.do_action (request)
  68. except Exception as e:
  69. print (e)
  70. #获取slb下所有服务器信息
  71. def getInstanceId(slb_id):
  72. request = DescribeLoadBalancerAttributeRequest()
  73. request.set_accept_format('json')
  74. request.set_LoadBalancerId(slb_id)
  75. response = clt.do_action_with_exception(request)
  76. return json.loads (response)
  77. #获取实例IP地址
  78. def getIpadd(instance_id):
  79. request = DescribeNetworkInterfacesRequest()
  80. request.set_accept_format('json')
  81. request.set_InstanceId(instance_id)
  82. response = clt.do_action_with_exception(request)
  83. request_content = json.loads(response)
  84. IpAddr = request_content['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress']
  85. return IpAddr
  86. #更新服务
  87. def update():
  88. time.sleep(10)
  89. global success_count
  90. apps = 'vlogapi'
  91. version = sys.argv[1]
  92. registry = 'registry-vpc.cn-hangzhou.aliyuncs.com/stuuudy/vlogapi:{}'.format(version)
  93. while not q2.empty():
  94. instance_id = q2.get()
  95. ipadd = getIpadd(instance_id)
  96. print("服务器信息:" + "%s/%s" %(instance_id, ipadd))
  97. client = docker.DockerClient(base_url='tcp://%s:2375' %(ipadd),timeout=60 )
  98. try:
  99. #更新前移除旧的容器
  100. id = client.containers.get(apps)
  101. id.remove(force = True)
  102. except Exception as e:
  103. print("容器不存在或者无法删除当前容器")
  104. try:
  105. #更新前删除旧的镜像
  106. images = client.images.list(all)
  107. for i in range(len(images)):
  108. if images[i]:
  109. client.images.remove(force=True, image=images[i].tags[0])
  110. time.sleep(2)
  111. #images = client.images.get(registry)
  112. #client.images.remove(force=True, image=registry)
  113. except Exception as e:
  114. print(e)
  115. print("镜像不存在,无法获取到镜像ID")
  116. sys.exit(0)
  117. try:
  118. #登录镜像仓库
  119. client.login(username='stuuudys' ,password='Qingqu@2019', registry='registry-vpc.cn-hangzhou.aliyuncs.com')
  120. #启动一个容器
  121. client.containers.run(registry, detach = True, cap_add = 'SYS_PTRACE', network_mode = 'host', name = apps,volumes={'/datalog/': {'bind': '/datalog/', 'mode': 'rw'}})
  122. checkHealth(ipadd)
  123. print("%s :权重修改中......" %(ipadd))
  124. setInstanceWeightProcess(instance_id)
  125. success_count = success_count + 1
  126. print("更新进度" + "%s/%s" %(success_count, total))
  127. except Exception as e:
  128. raise e
  129. sys.exit()#容器启动失败立即退出更新
  130. if __name__ == '__main__':
  131. #更新完成计数
  132. success_count = 0
  133. threads = []
  134. thread_num = 1
  135. res = getInstanceId (id_2)
  136. #slb下服务器总数
  137. total = len(res["BackendServers"]["BackendServer"])
  138. q1 = queue.Queue()
  139. q2 = queue.Queue()
  140. if res["BackendServers"]["BackendServer"]:
  141. for i in range ((len (res["BackendServers"]["BackendServer"]))):
  142. instance_id = res["BackendServers"]["BackendServer"][i]["ServerId"]
  143. q1.put(instance_id)
  144. while not q1.empty():
  145. for i in range (thread_num ):
  146. if q1.empty():
  147. break
  148. instance_id = q1.get ()
  149. setWeight (id_2,instance_id, 0)
  150. setWeight (id_3,instance_id, 0)
  151. setWeight (id_4,instance_id, 0)
  152. setWeight (id_5,instance_id, 0)
  153. q2.put(instance_id)
  154. for i in range (thread_num ):
  155. # 开启线程
  156. thread = MyThread (update)
  157. thread.start ()
  158. threads.append(thread)
  159. for thread in threads:
  160. thread.join ()