diff --git a/flask-consul/units/jms/sync_jms.py b/flask-consul/units/jms/sync_jms.py index ea0c066..46bd9ba 100755 --- a/flask-consul/units/jms/sync_jms.py +++ b/flask-consul/units/jms/sync_jms.py @@ -2,14 +2,33 @@ import datetime,requests,json,traceback from units import consul_kv,consul_manager,myaes from units.config_log import * +resource_type = ["ecs", "redis", "mysql", "mongodb"] + + def exist_ssh_port(port,protocols): for protocol in protocols: if protocol.get('name') == 'ssh': return protocol.get('port', port) if protocol.get('port') != port else port return port -#创建node -def create_node(jms_url,headers,now,node_id,cloud,account): + +# 创建节点 +def create_node(jms_url,headers, node_id, account): + node_url = f"{jms_url}/api/v1/assets/nodes/{node_id}/children/" + jms_node_list = requests.request("GET", node_url, headers=headers).json() + for resource in resource_type: + if resource not in [i['value'] for i in jms_node_list]: + response = requests.request("POST", node_url, headers=headers, data=json.dumps({'value': resource})) + if response.status_code != 201: + logger.error(f' 【JMS】创建{account}/{resource}分组失败,可能的原因:JumpServer URL 有重定向,请使用直连地址。') + logger.debug(f' 【JMS】{account}新增组===>{resource},{response.status_code}') + reget_node_list = requests.request("GET", node_url, headers=headers).json() + new_node_dict = {i['value']: i['id'] for i in reget_node_list} + return new_node_dict + + +# 创建资源组node +def create_resource_node(jms_url,headers,now,node_id,cloud,account): node_url = f"{jms_url}/api/v1/assets/nodes/{node_id}/children/" logger.debug(f'{node_url}==>{headers}') jms_node_list = requests.request("GET", node_url, headers=headers).json() @@ -30,7 +49,7 @@ def create_node(jms_url,headers,now,node_id,cloud,account): new_node_dict = {i['value']:i['id'] for i in reget_node_list} return new_node_dict -def update_jms_ecs(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,ecs_info,custom_ecs_info): +def update_jms(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,ecs_info,custom_ecs_info,resource_type): #比较云主机与JMS中对应node的主机列表,删除jms中多余的主机 ecs_url = f"{jms_url}/api/v1/assets/assets/" reget_ecs_list = requests.request("GET", f'{ecs_url}?node={node_id}', headers=headers).json() @@ -39,7 +58,7 @@ def update_jms_ecs(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,e except: jms_ecs_dict = {i.get('ip',i.get('address','IPNOTFOUND')):{'name':i.get('hostname',i.get('name','NAMENOTFOUND')),'id':i['id'],'protocols': i['protocols'],'comment':i['comment'],'node':i['nodes'][0]} for i in reget_ecs_list} - ecs_list = consul_manager.get_instances(f'{cloud}_{account}_ecs')['instances'] + ecs_list = consul_manager.get_instances(f'{cloud}_{account}_{resource_type}')['instances'] ecs_ip_dict = {i['address']:i['meta'][0]['name'] for i in ecs_list} ecs_dict = {i['ID']:{'name':i['meta'][0]['name'],'ip':i['address'],'ent':i['meta'][0]['group'],'ostype':i['meta'][0]['os'],'region':i['meta'][0]['region'],'vendor':i['meta'][0]['vendor']} for i in ecs_list} del_ecs_list = [v['id'] for k,v in jms_ecs_dict.items() if k not in [i['ip'] for i in ecs_dict.values()]] @@ -71,8 +90,6 @@ def update_jms_ecs(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,e payload = { "address": ip, "name": iname, - "protocols": [{"name": proto,"port": port}, {"name": "sftp", "port": port}], - "platform": '5' if platform == 'Windows' else '1', "is_active": True, "domain": "", "accounts":[{"template": admin_user.strip()}], @@ -84,13 +101,36 @@ def update_jms_ecs(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,e "ip": ip, "hostname": iname, "protocols": protocols, - "platform": platform, "is_active": True, "domain": "", "admin_user": admin_user.strip(), "nodes": [nodes], "comment": comment } + if platform == 'Linux': + payload["platform"] = '1' + payload["protocols"] = [{"name": proto, "port": port}, {"name": "sftp", "port": port}] + elif platform == 'Windows': + payload["platform"] = "5" + payload["protocols"] = [{"name": proto, "port": port}] + elif platform == 'Redis6+': + payload["platform"] = "25" + payload["protocols"] = [{"name": proto, "port": port}] + payload["spec_info"] = {"db_name": "0"} + elif platform == 'Redis': + payload["platform"] = '24' + payload["protocols"] = [{"name": proto, "port": port}] + payload["spec_info"] = {"db_name": "0"} + elif platform == 'Mysql': + payload["platform"] = '17' + payload["protocols"] = [{"name": proto, "port": port}] + elif platform == 'Mongodb': + payload["platform"] = '23' + payload["protocols"] = [{"name": proto, "port": port}] + payload["spec_info"] = {"db_name": "admin"} + else: + logger.error(f"未匹配到{platform}!") + continue try: if ip in jms_ecs_dict.keys(): jms_group = '无' if jms_ecs_dict[ip]['node'].split('/')[-1] == '未分组' else jms_ecs_dict[ip]['node'].split('/')[-1] @@ -105,6 +145,7 @@ def update_jms_ecs(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,e logger.error(f'{response.json()}') return ecs_ip_dict + #从JMS中删除IP重复的主机 def del_jms_repip(jms_url,headers,node_id,ecs_ip_dict): ecs_url = f"{jms_url}/api/v1/assets/assets/" @@ -125,7 +166,7 @@ def del_jms_repip(jms_url,headers,node_id,ecs_ip_dict): logger.info(f" 【JMS】删除IP重复且名称不在ECS列表的主机:{j['name']},{j['ip']},{response.status_code}") #从JMS中删除没有主机的组 -def del_node(jms_url,headers,now,node_id,cloud,account): +def del_node(jms_url,headers,now,node_id,cloud,account, main_node_id): node_tree_url = f"{jms_url}/api/v1/assets/nodes/children/tree/?id={node_id}" jms_node_list = requests.request("GET", node_tree_url, headers=headers).json() for i in jms_node_list: @@ -136,16 +177,17 @@ def del_node(jms_url,headers,now,node_id,cloud,account): del_node_url = f"{jms_url}/api/v1/assets/nodes/{i['meta']['data']['id']}/" response = requests.request("DELETE", del_node_url, headers=headers) logger.debug(f" 【JMS】删除空组===>{i['name']},{response.status_code}") - ecs_count_url = f"{jms_url}/api/v1/assets/assets/?node={node_id}&limit=1&offset=1" + ecs_count_url = f"{jms_url}/api/v1/assets/assets/?node={main_node_id}&limit=1&offset=1" ecs_count = requests.request("GET", ecs_count_url, headers=headers).json()['count'] data = {'count':ecs_count,'update':now,'status':20000,'msg':f'同步资源成功!总数:{ecs_count}'} consul_kv.put_kv(f'ConsulManager/record/jms/{cloud}/{account}', data) return 'ok' + def run(cloud,account): now = datetime.datetime.now().strftime('%m%d/%H:%M') logger.info(f'【JOB】===>{cloud},{account},JMS同步开始') - node_id = consul_kv.get_value(f'ConsulManager/jms/{cloud}/{account}/node_id')['node_id'] + main_node_id = consul_kv.get_value(f'ConsulManager/jms/{cloud}/{account}/node_id')['node_id'] temp_ecs_info = consul_kv.get_value(f'ConsulManager/jms/{cloud}/{account}/ecs_info') ecs_info = consul_kv.get_value(f'ConsulManager/jms/ecs_info') if temp_ecs_info == {} else temp_ecs_info temp_custom_ecs_info = consul_kv.get_value(f'ConsulManager/jms/{cloud}/{account}/custom_ecs_info') @@ -156,9 +198,17 @@ def run(cloud,account): jms_ver = jms.get('ver','V2') token = myaes.decrypt(jms.get('token')) headers = {'Content-Type': 'application/json','Authorization': f"Token {token}"} + type_nodes = create_node(jms_url, headers, main_node_id, account) + + for t, node_id in type_nodes.items(): + new_node_dict = create_resource_node(jms_url,headers,now,node_id,cloud,account) + if t in resource_type: + ecs_ip_dict = update_jms(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,ecs_info,custom_ecs_info, t) + del_jms_repip(jms_url,headers,node_id,ecs_ip_dict) + del_node(jms_url,headers,now,node_id,cloud,account,main_node_id) + else: + logger.error(f"{t} not exist!") - new_node_dict = create_node(jms_url,headers,now,node_id,cloud,account) - ecs_ip_dict = update_jms_ecs(jms_ver,jms_url,headers,new_node_dict,node_id,cloud,account,ecs_info,custom_ecs_info) - del_jms_repip(jms_url,headers,node_id,ecs_ip_dict) - del_node(jms_url,headers,now,node_id,cloud,account) logger.info(f'【JOB】===>{cloud},{account},JMS同步完成') + + diff --git a/flask-consul/views/jms.py b/flask-consul/views/jms.py index 8a840c5..b49fb3e 100644 --- a/flask-consul/views/jms.py +++ b/flask-consul/views/jms.py @@ -45,19 +45,30 @@ class Jms(Resource): services_meta = consul_kv.get_services_meta(f'{vendor}_{account}_ecs').get('ecs_list', []) count_ecs = len(services_meta) count_off, count_on, count_cpu, count_mem, count_win, count_linux = 0, 0, 0, 0, 0, 0 + count_redis, count_mongodb, count_mysql = 0, 0, 0 for i in services_meta: if i['os'] == 'linux': count_linux = count_linux + 1 + cpu = int(i['cpu'].replace('核', '')) + count_cpu = count_cpu + cpu + mem = float(i['mem'].replace('GB', '')) + count_mem = count_mem + mem elif i['os'] == 'windows': count_win = count_win + 1 + cpu = int(i['cpu'].replace('核', '')) + count_cpu = count_cpu + cpu + mem = float(i['mem'].replace('GB', '')) + count_mem = count_mem + mem + elif i['os'] in ['redis', 'redis6+']: + count_redis = count_redis + 1 + elif i['os'] == 'mysql': + count_mysql = count_mysql + 1 + elif i['os'] == 'mongodb': + count_mongodb = count_mongodb + 1 if i.get('stat') == 'off': count_off = count_off + 1 else: count_on = count_on + 1 - cpu = int(i['cpu'].replace('核', '')) - count_cpu = count_cpu + cpu - mem = float(i['mem'].replace('GB', '')) - count_mem = count_mem + mem jms_job = consul_kv.get_value(f"ConsulManager/jms/jobs/{vendor}/{account}") if jms_job == {}: @@ -75,6 +86,9 @@ class Jms(Resource): 'account': account, 'count_linux': count_linux, 'count_win': count_win, + 'count_redis': count_redis, + 'count_mysql': count_mysql, + 'count_mongodb': count_mongodb, 'count_mem': f'{count_mem}GB', 'count_cpu': f'{count_cpu}核', 'count_ecs': count_ecs, @@ -99,6 +113,13 @@ class Jms(Resource): linuxuid = ecs_info['linux'][-1] winport = ecs_info['windows'][0][0].split('/')[-1] winuid = ecs_info['windows'][-1] + redisport = ecs_info['redis'][0][0].split('/')[-1] + redisuid = ecs_info['redis'][-1] + mysqlport = ecs_info['mysql'][0][0].split('/')[-1] + mysqluid = ecs_info['mysql'][-1] + mongodbport = ecs_info['mongodb'][0][0].split('/')[-1] + mongodbuid = ecs_info['mongodb'][-1] + token = myaes.decrypt(jms_info['token']) custom_ecs_json = json.dumps(custom_ecs_info, indent=8) if custom_ecs_info != {} else '' jms_config = { @@ -109,6 +130,12 @@ class Jms(Resource): 'linuxuid': linuxuid, 'winport': winport, 'winuid': winuid, + 'redisport': redisport, + 'redisuid': redisuid, + 'mysqlport': mysqlport, + 'mysqluid': mysqluid, + 'mongodbport': mongodbport, + 'mongodbuid': mongodbuid, 'custom_ecs_info': custom_ecs_json, } else: @@ -125,6 +152,9 @@ class Jms(Resource): ecs_info = { "linux": [[f"ssh/{jms_config['linuxport']}"], jms_config['linuxuid']], "windows": [[f"rdp/{jms_config['winport']}"], jms_config['winuid']], + "redis": [[f"redis/{jms_config['redisport']}"], jms_config['redisuid']], + "mysql": [[f"mysql/{jms_config['mysqlport']}"], jms_config['mysqluid']], + "mongodb": [[f"mongodb/{jms_config['mongodbport']}"], jms_config['mongodbuid']], } consul_kv.put_kv('ConsulManager/jms/ecs_info', ecs_info) custom_ecs_info = jms_config['custom_ecs_info'] diff --git a/vue-consul/src/views/jms/index.vue b/vue-consul/src/views/jms/index.vue index bf92309..944654e 100644 --- a/vue-consul/src/views/jms/index.vue +++ b/vue-consul/src/views/jms/index.vue @@ -57,6 +57,21 @@ rdp端口:   管理用户ID: +
+

Redis:

+ redis端口: +   管理用户ID: +
+
+

Mongodb:

+ mongodb端口: +   管理用户ID: +
+
+

Mysql:

+ mysql端口: +   管理用户ID: +

全局特殊主机【管理用户】信息:

+ + + @@ -130,7 +148,8 @@ import { getJmsList, getJmsConfig, postJmsConfig, postJmsSwitch, postJmsSync } f export default { data() { return { - jms_config: { ver: 'V2', url: '', token: '', linuxport: '22', linuxuid: '', winport: '3389', winuid: '', custom_ecs_info: '' }, + jms_config: { ver: 'V2', url: '', token: '', linuxport: '22', linuxuid: '', winport: '3389', winuid: '', + redisport: '6379', redisuid: '', mysqlport: '3306', mysqluid: '', mongodbport: '3317', mongodbuid: '', custom_ecs_info: '' }, listLoading: false, dialogFormVisible: false, query: { vendor: '', account: '' },