longvideoapi_update.py 6.0 KB

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