def addsshcredits(ip, user, passwd): ansible_os_param = "/usr/bin/ansible " + ip + " -i " + ip + ", -m 'command' -a 'uname' -e 'ansible_user="******" ansible_ssh_pass="******"'" log().info('get OS Info::' + ansible_os_param) retVal = subprocess.check_output([ansible_os_param], shell=True) baseDir = '' osType = retVal.split('>>')[1].strip() ansible_param = '' if user == 'root': if osType.lower() == 'linux': baseDir = '/root/' elif osType.lower() == 'aix': baseDir = '/' elif osType.lower() == 'hp-ux': baseDir = '/' ansible_param = "/usr/bin/ansible " + ip + " -i " + ip + ", -m authorized_key -a 'user="******" key={{ lookup(\"file\",\"/root/.ssh/id_rsa.pub\") }} path='" + baseDir + ".ssh/authorized_keys'' -e 'ansible_user="******" ansible_ssh_pass="******"'" else: baseDir = '/home/' + user + '/' ansible_param = "/usr/bin/ansible " + ip + " -i " + ip + ", -m authorized_key -a 'user="******" key={{ lookup(\"file\",\"" + str( baseDir ) + ".ssh/id_rsa.pub\") }} path='" + baseDir + ".ssh/authorized_keys'' -e 'ansible_user="******" ansible_ssh_pass="******"'" log().info(ansible_param) retVal = subprocess.call([ansible_param], shell=True) if retVal == 0: return 'success' else: return 'fail'
def getMqFixpack(self, path, version, ostype=None): log().debug('fp::getMqFixpack ' + path + ' ' + str(ostype)) os_dict = {'linux': '(lin|x86)', 'aix': 'aix', 'windows': 'win'} os_exp = os_dict.get(ostype) out = [] final = {} if os_exp: files = os.listdir(path + '/' + version) for elem in files: fix_search_Obj = re.search( r'(^[0-9\.]+).+' + os_exp + '.+fp0+([1-9]+).*', elem, re.I) if fix_search_Obj: fix_dict = {} fix_dict = { fix_search_Obj.group(1) + '.' + fix_search_Obj.group(3): fix_search_Obj.group() } out.append(fix_dict) final[version] = out fps = json.dumps(final) self.write(fps) self.finish() else: log().warning('fp::getMqFixPack this os is not supported') self.write({'status': 0, 'message': 'this os is not support.'}) self.finish()
def getwasVersion(self, path, ostype=None): os_dict = {'linux': '(lin|x86)', 'aix': 'aix', 'windows': 'win'} os_exp = os_dict.get(ostype) ver_dict = {} out = [] if os_exp: ver_list = os.listdir(path) ver_list.sort() for ver in ver_list: files = os.listdir(path + '/' + ver) for file in files: ver_search_Obj = re.search(r'(wasnd_v' + ver + '.*)_.*zip', file, re.I) if ver_search_Obj: ver_dict.update( {ver: ver_search_Obj.group(1) + '*zip'}) # ver_dict={} # ver_dict[ver]=ver_search_Obj.group() # out.append(ver_dict) vers = json.dumps(ver_dict) log().debug('fp::getwasVersion' + str(vers)) self.write(vers) self.finish() else: print("this os is not supported") self.write([]) self.finish()
def login(self, name, passwd, role): try: log().debug('login::' + name + ' ' + passwd + ' ' + str(role)) result = mongoOps.db().login.find_one({'name': name}, {'_id': 0}) if result is None: self.write({'status': 0, 'message': '账号不存在,或账号权限非法!'}) log().info('login::账号不存在,或账号权限非法!') self.finish() else: if passwd == result['password']: del result['password'] del result['email'] product = result['product'] out = ','.join(product) result['product'] = out self.write({'status': 1, 'message': json.dumps(result)}) log().info('login::' + name + ' login success') self.finish() else: self.write({'status': 0, 'message': '密码错误!'}) log().info('login::密码错误!') self.finish() except Exception, err: self.write({'status': 0, 'message': '登录异常,异常为:' + str(err)}) log().error('login::登录异常,异常为' + str(err)) self.finish()
def post(self): playbookParam = self.createParam() jsonPath = self.createFile(playbookParam[1], playbookParam[4]) #json参数文件地址 playbookuuid = playbookParam[0] #读取配置文件 #playbooksPath=get_conf('tornado','playbook_path') playbooksPath = getProjPath() + '/playbooks/deploy/' playbookymlpath = playbooksPath + playbookParam[1] + '.yml' playbook_yaml = yaml.load(file(playbookymlpath)) # 创建playbooks 子节点plays plays = createPlaybookPlay(playbook_yaml) # create tasks (playlist, tasklist) = createPlayTask(playbook_yaml, demjson.decode(playbookParam[4]), playbookuuid) #mongoOps.InsertTasksDB(tasklist) #创建playbook tasklistNum = len(tasklist) #获取task数量 createPlaybook(playbookuuid, playbookParam, playbook_yaml, playlist, tasklistNum) #去跑playbook log().info('run::post 开始运行playbook') #tasks.deploy_run_playbook.delay(playbookParam[1],jsonPath) tasks.deploy_run_playbook.apply_async( args=[playbookParam[1], jsonPath], queue='queue_deploy_run_playbook') self.write({ 'status': 'ok', 'message': 'runhandler::初始化正确,开始运行Playbook!' }) self.finish()
def judgeServerStatus(srvList): statusDict = getIPStatus(srvList) outDict = {} for srv in statusDict: try: if statusDict[srv] == 1: # reachable result = mongoOps.db().servers.find_one({'ip': srv}, {'_id': 0}) ret = addsshcredits(srv, result['userid'], result['password']) log().info('addssh::' + ret) if ret == 'success': osInfo = getOSInfo(srv) # get update infomation mongoOps.db().servers.update({'ip': srv}, { '$set': { 'name': osInfo['name'], 'hvisor': osInfo['hvisor'], 'os': osInfo['os'], 'hconf': osInfo['hconf'], 'status': 'Active' } }) outDict[srv] = 1 else: outDict[srv] = 2 # 2 means ping is ok ,but ssh exist error else: # the return valu is 0 or 2 means error mongoOps.db().servers.update({'ip': srv}, {'$set': { 'status': 'Error' }}) outDict[srv] = 0 except Exception, e: print e outDict[srv] = 3 # 3 means non know error
def post(self): log().debug('fp::post 收到数据' + self.request.body) body = json.loads(self.request.body) pName = body['pName'] platform = body['platform'] if pName == 'db2': db2Path = body['db2Path'] if 'version' == body['type']: self.getDb2Version(db2Path, platform) elif 'fix' == body['type']: version = body['version'] self.getDb2fixpack(db2Path, version, platform) elif pName == 'itmos': itmosPath = body['itmosPath'] if 'version' == body['type']: self.getitmosVersion(itmosPath, platform) elif 'fix' == body['type']: version = body['version'] self.getitmosFixpack(itmosPath, version, platform) elif pName == 'ihs': ihsPath = body['ihsPath'] if 'version' == body['type']: self.getihsVersion(ihsPath, platform) elif 'fix' == body['type']: version = body['version'] self.getihsfixpack(ihsPath, version, platform) elif 'im' == body['type']: version = body['version'] self.getwasIM(ihsPath, version, platform) elif pName == 'was': wasPath = body['wasPath'] if 'version' == body['type']: self.getwasVersion(wasPath, platform) elif 'fix' == body['type']: version = body['version'] self.getwasFixpack(wasPath, version, platform) elif 'im' == body['type']: version = body['version'] self.getwasIM(wasPath, version, platform) elif pName == 'mq': mqPath = body['mqPath'] if 'fix' == body['type']: version = body['version'] self.getMqFixpack(mqPath, version, platform) elif 'version' == body['type']: self.getMqVersion(mqPath, platform) else: self.write({'status': 0, 'message': 'you input a error message'}) log().info('fp::post 你输入了错误的信息') self.finish()
def createPlayTask(yaml, json, playbook_uuid): for sub_item in yaml: sub_item['uuid'] = str(uuid.uuid1()) sub_item['playbook_uuid'] = playbook_uuid tasklist = [] playlist = [] for sub_item in yaml: dict_temp = {} dict_temp['uuid'] = sub_item['uuid'] dict_temp['name'] = sub_item['name'] playlist.append(dict_temp) for sub_item in yaml: for final_item in sub_item['tasks']: if sub_item['hosts'] == 'localhost' or sub_item[ 'hosts'] == '127.0.0.1': tasktemp = {} tasktemp['uuid'] = str(uuid.uuid1()) tasktemp['host'] = '127.0.0.1' tasktemp['name'] = final_item['name'] tasktemp['play_uuid'] = sub_item['uuid'] tasktemp['status'] = 0 tasktemp['playbook_uuid'] = playbook_uuid tasktemp['created_at'] = time.time() tasklist.append(tasktemp) else: iplist = json['ip_list'] for ip in iplist: if final_item.has_key('name'): tasktemp = {} tasktemp['uuid'] = str(uuid.uuid1()) tasktemp['host'] = str(ip) tasktemp['name'] = final_item['name'] tasktemp['play_uuid'] = sub_item['uuid'] tasktemp['status'] = 0 tasktemp['playbook_uuid'] = playbook_uuid tasktemp['created_at'] = time.time() tasklist.append(tasktemp) if final_item.has_key('block'): for subBlockItem in final_item['block']: tasktemp = {} tasktemp['uuid'] = str(uuid.uuid1()) tasktemp['host'] = str(ip) tasktemp['name'] = subBlockItem['name'] tasktemp['play_uuid'] = sub_item['uuid'] tasktemp['status'] = 0 tasktemp['playbook_uuid'] = playbook_uuid tasktemp['created_at'] = time.time() tasklist.append(tasktemp) mongoOps.InsertTasksDB(tasklist) log().info('run::createPlaybooktask 创建tasks成功') return (playlist, tasklist)
def createServer(self,target): servers=[] servers.append(target['ip']) try: result=mongoOps.db().servers.insert(target) log().debug('servers::createServer'+str(result)) if result is None: self.write({"status":0,"message":"创建服务器失败!"}) log().info('servers::createServer'+'创建服务器失败') self.finish() else: #tasks.updateServerInfo.delay(servers) #tasks.updateServerInfo.delay(servers) del target['_id'] #删除_id 无法取出_id 值 #tasks.updateServerInfo.delay(target) # addIP represitent operation is add a server then add ip to group tasks.updateServerInfo.apply_async(args=[target,'addIP'],queue='default') self.write({"status":1,"message":"创建服务器成功!"}) log().info('servers::createServer'+"创建服务器成功!") self.finish() #tasks.updateServerInfo.apply_async(servers) except Exception ,e : print e self.write({"status":0,"message":"调用mongoDB出错,出错为"+str(e)}) log().error("servers::createServer调用mongoDB出错,出错为"+str(e)) self.finish()
def getDb2Version(self, path, ostype=None): os_dict = {'linux': '(lin|x86)', 'aix': 'aix', 'windows': 'win'} os_exp = os_dict.get(ostype) ver_dict = {} if os_exp: ver_list = os.listdir(path) ver_list.sort() for ver in ver_list: ver_dict.update({ver: ver}) vers = json.dumps(ver_dict, indent=2) log().info(vers) self.write(vers) self.finish() else: log().info("this os is not supported") self.write([]) self.finish()
def createPlaybook(playbookuuid, playbookParam, playbook_yaml, playlist, tasklistNum): playbook_value = {} playbook_value['uuid'] = playbookuuid playbook_value['name'] = playbookParam[1] playbook_value['created_at'] = time.time() playbook_value['status'] = 0 #playbook_value['total']=getTotalTaskNum(playbook_yaml,len(playbookParam[3])) playbook_value['total'] = tasklistNum playbook_value['completed'] = 0 playbook_value['plays'] = playlist playbook_value['options'] = str(playbookParam[4]) #print playbookParam[3] playbook_value['nodes'] = playbookParam[3] log().debug('run::createPlaybook' + str(playbook_value)) mongoOps.InsertPlaybooksDB(playbook_value) log().info('run::createPlaybook success')
def getIPStatus(srvList): retDict = {} for srv in srvList: param = 'ping ' + srv + ' -c 1 -w 1' try: p = subprocess.Popen([param], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) out = p.stdout.read() regex = re.compile('100% packet loss') if len(regex.findall(out)) == 0: # the host is unreachable retDict[srv] = 1 # 1 means ok else: retDict[srv] = 0 # 0 means error except: log().info('the network work error') retDict[srv] = 2 # 2 means network error return retDict
def post(self): try: log().debug('servers::'+self.request.body) body = json.loads(self.request.body) operType=body['type'] if operType == 'createServer': server=body['server'] self.createServer(server) elif operType =='importExcel': servers=body['servers'] self.importExcel(servers) elif operType =='IPCheck': ip=body['IP'] self.IPCheck(ip) elif operType == 'deleteServer': servers=body['servers'] self.deleteServers(servers) elif operType == 'modifyServer': server=body['server'] self.modifyServer(server) else: self.write({"status":0,"message":"你提供了错误的代码,无法返回数据"}) log().error("servers::你提供了错误的代码,无法返回数据") self.finish() except Exception ,e : log().error('servers::'+str(e)) self.write({"status":0,"message":str(e)}) self.finish()
def post(self): try: body = json.loads(self.request.body) operType = body['type'] if operType == 'login': log().info('login::user start login') name = body['name'] password = body['password'] role = body['role'] self.login(name, password, role) elif operType == 'checkUser': name = body['name'] self.checkUser(name) elif operType == 'addUser': name = body['name'] password = body['password'] role = body['role'] email = body['email'] product = body['product'] self.addUser(name, password, role, email, product) elif operType == 'delUser': name = body['name'] self.delUser(name) else: self.write({ "status": 0, "message": "调用/api/v1/users/接口异常,请检查参数类型!" }) log().error('调用/api/v1/users接口异常,请检查参数') self.finish() except Exception, e: self.write({"status": 0, "message": "JSon解析数据异常,出错为" + str(e)}) log().error({"status": 0, "message": "JSon解析数据异常,出错为" + str(e)}) self.finish()
def createFile(self, playbookname, paramcontent): log().info('开始创建playbook json文件') jsonpath = get_conf('tornado', 'json_path') currentTime = datetime.datetime.now().strftime('%Y%m%d%H%M%S') fileDir = jsonpath + "/deploy/" + playbookname + '/' + currentTime try: #os.mkdir(fileDir) os.makedirs(fileDir) except: retVal = { 'status': 'error', 'message': 'runHandler::创建存放json文件失败,请查找原因!' } log().error('run::createFile 创建存放json文件失败') self.write(retVal) self.finish() sys.exit(0) JsonPath = fileDir + '/' + playbookname + '.json' try: fs = open(JsonPath, 'w') fs.write(paramcontent) log().debug('run::createFile 写入文件的内容是' + paramcontent) fs.flush() fs.close() except Exception: if fs is None: pass else: fs.close() return JsonPath
def getitmosVersion(self, path, ostype=None): os_dict = {'linux': '(lin|x86)', 'aix': 'aix', 'windows': 'win'} os_exp = os_dict.get(ostype) ver_dict = {} if os_exp: ver_list = os.listdir(path) ver_list.sort() for ver in ver_list: files = os.listdir(path + '/' + ver) for file in files: ver_search_Obj = re.search( r'(ITM_V' + ver + '.*)_.*tar.gz', file, re.I) if ver_search_Obj: ver_dict.update({ver: ver_search_Obj.group()}) vers = json.dumps(ver_dict, indent=2) log().info(vers) self.write(vers) self.finish() else: print("this os is not supported") self.write([]) self.finish()
def getDb2fixpack(self, path, version, ostype=None): os_dict = {'linux': '(lin|x86)', 'aix': 'aix', 'windows': 'win'} os_exp = os_dict.get(ostype) fix_dict = {} if os_exp: files = os.listdir(path + '/' + version) for elem in files: fix_search_Obj = re.search( r'^v' + version + 'fp([0-9]+).*' + os_exp + '.*tar.gz', elem, re.I) if fix_search_Obj: fix_dict.update({ version + '.0.' + fix_search_Obj.group(1): fix_search_Obj.group() }) fps = json.dumps(fix_dict, indent=2) log().info(fps) self.write(fps) self.finish() else: log().info("this os is not supported") self.write([]) self.finish()
def getihsVersion(self, path, ostype=None): os_dict = {'linux': '(lin|x86)', 'aix': 'aix', 'windows': 'win'} os_exp = os_dict.get(ostype) ver_dict = {} if os_exp: ver_list = os.listdir(path) ver_list.sort() for ver in ver_list: files = os.listdir(path + '/' + ver) for file in files: ver_search_Obj = re.search( r'(was_v' + ver + '.*suppl).*zip', file, re.I) if ver_search_Obj: ver_dict.update( {ver: ver_search_Obj.group(1) + '*zip'}) vers = json.dumps(ver_dict, indent=2) log().debug('fp::getihsVersion' + str(vers)) self.write(vers) self.finish() else: log().info("this os is not supported") self.write([]) self.finish()
def getitmosFixpack(self, path, version, ostype=None): os_dict = {'linux': '(lin|x86)', 'aix': 'aix', 'windows': 'win'} os_exp = os_dict.get(ostype) fix_dict = {} if os_exp: files = os.listdir(path + '/' + version) for elem in files: fix_search_Obj = re.search( r'(^[0-9\.]+)(-TIV-ITM_TMV-Agents-FP0+)([1-9]+).tar.gz', elem, re.I) if fix_search_Obj: fix_dict.update({ fix_search_Obj.group(1) + '.' + fix_search_Obj.group(3): fix_search_Obj.group(1) + fix_search_Obj.group(2) + fix_search_Obj.group(3) + '.tar.gz' }) fps = json.dumps(fix_dict, indent=2) log().info(fps) self.write(fps) self.finish() else: log().info("this os is not supported") self.write([]) self.finish()
def getMqVersion(self, path, ostype=None): log().debug('fp::getMqVersion ' + path + ' ' + ostype) os_dict = {'linux': '(lin|x86)', 'aix': 'aix', 'windows': 'win'} os_exp = os_dict.get(ostype) out = [] if os_exp: ver_list = os.listdir(path) ver_list.sort() for ver in ver_list: files = os.listdir(path + '/' + ver) for file in files: ver_search_Obj = re.search(r'ws_mq.+' + os_exp + '[^fp].*', file, re.I) if ver_search_Obj: ver_dict = {} ver_dict[ver] = ver_search_Obj.group() out.append(ver_dict) vers = json.dumps(out) log().debug('fp::getMqVersion' + str(vers)) self.write(vers) self.finish() else: self.write([]) self.finish()
def createParam(self): try: log().debug('run::createparam 收到数据' + self.request.body) body = json.loads(self.request.body) except Exception: retVal = { 'status': 'error', 'message': 'runHandler::收到的数据不满足Json格式,请处理!' } log().error('run::createParam' + '收到的数据不满足Json格式,请处理!') self.write(retVal) self.finish() sys.exit(0) playbookuuid = body['playbook-uuid'] playbookname = body['playbook-name'] productname = body['product-name'] nodes = body['nodes'] paramcontent = base64.b64decode(str( body['param-content'])) #playbook json参数文件 解码base64 #print paramcontent log().info('run::createparam 分解数据正常') return (playbookuuid, playbookname, productname, nodes, paramcontent)