def consulPublish(src, desc, con_key): #filepath = '/opt/local/jenkins/workspace' + src #assert os.path.exists(filepath), 'File: "%s" is not exists!' % filepath cl = consul() cluster = upstreams.get(con_key) hosts = {} for bk in cluster: idc = bk.get('idc') ip = bk.get('ip') for h in getHostname(ip): if idc not in h: continue hosts[h] = ip print('#' * 50) res = simplejson.loads(cl.upload(hosts.keys(), src, desc)) print(res) if res.get('code') == 0: msg = res.get('msg') for k, v in msg.items(): ip = hosts.get(k) if not ip: continue logger.info('HOST: {} upload SUCCESS ! - {}'.format(ip, v)) logger.info('{:.2f}% upload SUCCESS!'.format( float(len(msg)) / float(len(hosts)) * 100.0)) else: logger.error('FAILED!!! - {} {}'.format(res.get('code'), res.get('msg'))) print('FAILED!!! - {} {}'.format(res.get('code'), res.get('msg'))) sys.exit(res.get('code')) print('#' * 50)
def command(script, *ips): s_t = script[-2:] hosts = {} cl = consul() for ip in ips: hnames = getHostname(ip) for h in hnames: hosts[h] = ip res = simplejson.loads( cl.remoteCommand(hosts.keys(), '{} {}'.format(scmd.get(s_t), script))) print(res) if not res: logger.error(res) sys.exit(5) for h, msg in res.items(): ip = hosts.get(h) if not ip: continue retcode = msg.get('retcode') ret = msg.get('ret') if retcode != 0: logger.error('{}:{} Failed!!! \n{}'.format(ip, h, ret)) print('{}:{} Failed!!! \n{}'.format(ip, h, ret)) sys.exit(retcode) else: logger.info('{}:{} Success.\n{}'.format(ip, h, ret))
def publish(src, desc, *ips): #filepath = '/opt/local/jenkins/workspace' + src #assert os.path.exists(filepath), 'File: "%s" is not exists!' % filepath hosts = {} cl = consul() for ip in ips: hnames = getHostname(ip) for h in hnames: hosts[h] = ip res = simplejson.loads(cl.upload(hosts.keys(), src, desc)) print(res) if res.get('code') == 0: msg = res.get('msg') print('#' * 50) for k, v in msg.items(): ip = hosts.get(k) if not ip: continue logger.info('HOST: {} upload SUCCESS! - {}'.format(ip, v)) logger.info('{:.2f}% upload SUCCESS!'.format( float(len(msg)) / float(len(ips)) * 100.0)) else: logger.error('FAILED!!! - {} {}'.format(res.get('code'), res.get('msg'))) print('FAILED!!! - {} {}'.format(res.get('code'), res.get('msg'))) sys.exit(res.get('code'))
def consulCommand(script, con_key, flag='*'): cl = consul() s_t = script[-2:] for host in gethosts(con_key, flag): idc, ip, port, lock, down, bid = host hostname = [] for h in getHostname(ip): if idc not in h: continue hostname.append(h) if down == 0: print('#' * 50) res = simplejson.loads(cl.onoff('off', bid)) if res.get('code') != 0: sys.exit(res.get('code')) else: logger.info('{}:{} is down.'.format(ip, port)) down = 1 else: logger.info('{}:{} is already down yet.'.format(ip, port)) print('#' * 50) res = simplejson.loads( cl.remoteCommand(hostname, '{} {}'.format(scmd.get(s_t), script))) #print(res) res_msg = res.get(hostname[0]) retcode = res_msg.get('retcode') msg = res_msg.get('ret') if retcode != 0: logger.error('{}:{} Failed!!! \n{}'.format(ip, port, msg)) print('{}:{} Failed!!! \n{}'.format(ip, port, msg)) sys.exit(retcode) else: if 'shell_exit_with_error_code' in msg: logger.error('{}:{} Failed!!! \n{}'.format(ip, port, msg)) print('{}:{} Failed!!! \n{}'.format(ip, port, msg)) sys.exit(100) else: logger.info('{}:{} Success.\n{}'.format(ip, port, msg)) if down == 1: res = simplejson.loads(cl.onoff('on', bid)) if res.get('code') != 0: sys.exit(res.get('code')) else: logger.info('{}:{} is online.'.format(ip, port)) down = 0 else: logger.info('{}:{} is already online.'.format(ip, port))
def get_idcs(): cl = consul() idcnames = {} idcs = simplejson.loads(cl.getInfo('idc')).get('msg') for idc in idcs: idc_tag = idc.get('tag') idc_id = idc.get('id') idcnames[idc_id] = idc_tag business = simplejson.loads(cl.getInfo('business')).get('msg') idcs = {} for bs in business: tag = bs.get('tag') idc = bs.get('idc') idc_tag = idcnames.get(idc) idcs[tag] = idc_tag return idcs
def get_upstreams(): cl = consul() clusters = {} idcs = get_idcs() res = simplejson.loads(cl.getInfo('upstream')).get('msg') for upstream in res: stat = upstream.get('stat') if not stat: continue cluster = upstream.get('cluster') parent = upstream.get('parent') cid = upstream.get('id') con_key = '{}/{}'.format(parent, cluster) info = clusters.get(cid, {}) info = {'consul': con_key, 'idc': idcs.get(parent)} clusters[cid] = info upstreams = {} backends = simplejson.loads(cl.getInfo('backend')).get('msg') for bs in backends: uid = bs.get('upstream') info = clusters.get(uid) conkey = info.get('consul') idc = info.get('idc') ip, port = bs.get('ip').split(':') bid = bs.get('id') down = bs.get('down') lock = bs.get('lock') us = upstreams.get(conkey, []) us.append({ 'backend_id': bid, 'ip': ip, 'port': port, 'down': down, 'lock': lock, 'idc': idc }) upstreams[conkey] = us return upstreams
def gethosts(con_key, flag): os.remove('/opt/local/pickle/upstreams.pkl') _, upstreams = getinfo.main() cluster = upstreams.get(con_key) cl = consul() hosts = [] for bk in cluster: idc = bk.get('idc') ip = bk.get('ip') port = bk.get('port') lock = bk.get('lock') down = bk.get('down') bid = bk.get('backend_id') # 判断 机器状态,将锁定机器自动解锁 if down == 1 and lock: res = simplejson.loads(cl.onoff('on', bid)) if res.get('code') != 0: logger.error('{}:{} get on failed, {}', format(ip, port, res.get('msg'))) sys.exit(res.get('code')) else: logger.info('{}:{} is online.'.format(ip, port)) down = 0 lock = False for case in switch(flag): if case(r'(((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))\.){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])):\d{2,5}' ): if flag == '{}:{}'.format(ip, port): hosts.append((idc, ip, port, lock, down, bid)) else: continue break if case(r'(((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))\.){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])):\*' ): if flag == '{}:{}'.format(ip, '*'): hosts.append((idc, ip, port, lock, down, bid)) else: continue break if case(r'(((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))\.){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])):!\d{2,5}' ): iflag, pflag = flag.split(':') if iflag == ip and pflag != '!{}'.format(port): hosts.append((idc, ip, port, lock, down, bid)) else: continue break if case(r'!(((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))\.){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])):\d{2,5}' ): iflag, pflag = flag.split(':') if iflag != '!{}'.format(ip) and pflag == str(port): hosts.append((idc, ip, port, lock, down, bid)) else: continue break if case(r'!(((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))\.){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])):\*' ): iflag, pflag = flag.split(':') if iflag != '!{}': hosts.append((idc, ip, port, lock, down, bid)) else: continue break if case(r'!(((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))\.){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])):!\d{2,5}' ): if flag != '!{}:!{}'.format(ip, port): hosts.append((idc, ip, port, lock, down, bid)) else: continue break if case(r'\*:\d{2,5}'): if flag == '*:{}'.format(port): hosts.append((idc, ip, port, lock, down, bid)) else: continue break if case(r'\*:!\d{2,5}'): if flag != '*:{}'.format(port): hosts.append((idc, ip, port, lock, down, bid)) else: continue if case(r'\*|\*:\*'): hosts.append((idc, ip, port, lock, down, bid)) return hosts