| 
					
				 | 
			
			
				@@ -0,0 +1,181 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#!/u:sr/bin/env python 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#coding=utf-8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#edite  panwang 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import docker 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import sys 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import  requests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import json 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import queue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import threading 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from aliyunsdkcore import client 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from aliyunsdkess.request.v20140828.DescribeScalingInstancesRequest import DescribeScalingInstancesRequest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from aliyunsdkcore.request import CommonRequest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from aliyunsdkslb.request.v20140515.DescribeLoadBalancerAttributeRequest import DescribeLoadBalancerAttributeRequest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+AccessKey = 'LTAIuPbTPL3LDDKN' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+AccessSecret = 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+RegionId = 'cn-hangzhou' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+clt = client.AcsClient (AccessKey, AccessSecret, RegionId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#stress 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#slb_id = 'lb-bp12usgpoh04qsa6pw42r' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#longvidleoapi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#id_2 = 'lb-bp1lktzqe3mksoj8whjdf' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+id_2 = 'lb-bp1qk9mkvjtundlzz7owm' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+id_3 = 'lb-bp1by407qxe4y7bkvye27' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+id_4 = 'lb-bp1akia6vlguiwg4znaq8' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+id_5 = 'lb-bp1pj2v06ladvgftgxcp0' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class MyThread (threading.Thread): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __init__(self, func): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        threading.Thread.__init__ (self) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.func = func 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def run(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.func () 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#健康检查 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def  checkHealth(ipadd): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while  True: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        health_url = 'http://%s:8080/longvideoapi/test' %(ipadd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        header = {"Content-Type":"application/json"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            health_code = requests.get(health_url).status_code 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except  Exception  as  e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if  health_code == 200: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return  False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#服务更新完之后逐步修改服务器的权重值,直接加载100会出现502。权重值每次增加10,每2s修改一次 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def setInstanceWeightProcess(instance_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for  i in range(1,6): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        weight = i*20 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        setWeight(id_2,instance_id,weight) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        setWeight(id_3,instance_id,weight) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        setWeight(id_4,instance_id,weight) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        setWeight(id_5,instance_id,weight) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        time.sleep(5) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#设置权重 instance_id :服务器id,weight:权重值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def setWeight(slb_id,instance_id ,weight): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    BackendServers = [{"ServerId": instance_id, "Weight": weight}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = CommonRequest () 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.set_accept_format ('json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.set_domain ('slb.aliyuncs.com') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.set_version ('2014-05-15') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.set_method ('POST') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.set_action_name ('SetBackendServers') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.add_query_param ('BackendServers', BackendServers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.add_query_param ('LoadBalancerId', slb_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response = clt.do_action (request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print (e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#获取slb下所有服务器信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def  getInstanceId(slb_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = DescribeLoadBalancerAttributeRequest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.set_accept_format('json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.set_LoadBalancerId(slb_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response = clt.do_action_with_exception(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return json.loads (response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#获取实例IP地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def  getIpadd(instance_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = DescribeNetworkInterfacesRequest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.set_accept_format('json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.set_InstanceId(instance_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response = clt.do_action_with_exception(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request_content = json.loads(response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    IpAddr  = request_content['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return  IpAddr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#更新服务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def  update(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    time.sleep(10) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    global success_count 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    apps = 'vlogapi' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    version = sys.argv[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    registry = 'registry-vpc.cn-hangzhou.aliyuncs.com/stuuudy/vlogapi:{}'.format(version) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while  not q2.empty(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        instance_id = q2.get() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ipadd = getIpadd(instance_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print("服务器信息:" + "%s/%s" %(instance_id, ipadd)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        client = docker.DockerClient(base_url='tcp://%s:2375'  %(ipadd),timeout=60 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        #更新前移除旧的容器 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            id = client.containers.get(apps) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            id.remove(force = True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print("容器不存在或者无法删除当前容器") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #更新前删除旧的镜像 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            images = client.images.list(all) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for  i in range(len(images)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if images[i]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 client.images.remove(force=True, image=images[i].tags[0]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 time.sleep(2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #images = client.images.get(registry) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #client.images.remove(force=True, image=registry) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print("镜像不存在,无法获取到镜像ID") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            sys.exit(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #登录镜像仓库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            client.login(username='stuuudys' ,password='Qingqu@2019', registry='registry-vpc.cn-hangzhou.aliyuncs.com') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #启动一个容器 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            client.containers.run(registry, detach = True, cap_add = 'SYS_PTRACE', network_mode = 'host', name = apps,volumes={'/datalog/': {'bind': '/datalog/', 'mode': 'rw'}}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            checkHealth(ipadd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print("%s :权重修改中......" %(ipadd)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setInstanceWeightProcess(instance_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            success_count = success_count + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print("更新进度" + "%s/%s"  %(success_count, total)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            raise e 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            sys.exit()#容器启动失败立即退出更新 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if __name__ == '__main__': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    #更新完成计数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    success_count = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    threads = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    thread_num = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    res = getInstanceId (id_2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    #slb下服务器总数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    total = len(res["BackendServers"]["BackendServer"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    q1 = queue.Queue() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    q2 = queue.Queue() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if res["BackendServers"]["BackendServer"]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for i in range ((len (res["BackendServers"]["BackendServer"]))): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            instance_id = res["BackendServers"]["BackendServer"][i]["ServerId"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            q1.put(instance_id)             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while not  q1.empty(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for i in range (thread_num ): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if q1.empty(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            instance_id = q1.get () 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setWeight (id_2,instance_id, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setWeight (id_3,instance_id, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setWeight (id_4,instance_id, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setWeight (id_5,instance_id, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            q2.put(instance_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for i in range (thread_num ): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 开启线程 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            thread = MyThread (update) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            thread.start () 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            threads.append(thread) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for thread in threads: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            thread.join () 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |