添加jumpserver同步redis、mysql、mongodb
parent
60d77b9d1d
commit
e5ed045a04
|
@ -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同步完成')
|
||||
|
||||
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -57,6 +57,21 @@
|
|||
rdp端口:<el-input v-model="jms_config.winport" style="width: 72px;" />
|
||||
管理用户ID:<el-input v-model="jms_config.winuid" style="width: 300px;" />
|
||||
</div>
|
||||
<div class="demo-input-suffix">
|
||||
<h4>Redis:</h4>
|
||||
redis端口:<el-input v-model="jms_config.redisport" style="width: 72px;" />
|
||||
管理用户ID:<el-input v-model="jms_config.redisuid" style="width: 300px;" />
|
||||
</div>
|
||||
<div class="demo-input-suffix">
|
||||
<h4>Mongodb:</h4>
|
||||
mongodb端口:<el-input v-model="jms_config.mongodbport" style="width: 72px;" />
|
||||
管理用户ID:<el-input v-model="jms_config.mongodbuid" style="width: 300px;" />
|
||||
</div>
|
||||
<div class="demo-input-suffix">
|
||||
<h4>Mysql:</h4>
|
||||
mysql端口:<el-input v-model="jms_config.mysqlport" style="width: 72px;" />
|
||||
管理用户ID:<el-input v-model="jms_config.mysqluid" style="width: 300px;" />
|
||||
</div>
|
||||
<hr style="FILTER: alpha(opacity=100,finishopacity=0,style=2)" align=left width="96%" SIZE=1>
|
||||
<h3>全局特殊主机【管理用户】信息:</h3>
|
||||
<el-input v-model="jms_config.custom_ecs_info" :autosize="{ minRows: 5, maxRows: 18 }" type="textarea"
|
||||
|
@ -77,6 +92,9 @@
|
|||
<el-table-column prop="account" label="账号" sortable align="center" width="100" show-overflow-tooltip />
|
||||
<el-table-column prop="count_linux" label="Linux" sortable align="center" width="90" />
|
||||
<el-table-column prop="count_win" label="Win" sortable align="center" width="80" />
|
||||
<el-table-column prop="count_redis" label="Redis" sortable align="center" width="80" />
|
||||
<el-table-column prop="count_mysql" label="Mysql" sortable align="center" width="80" />
|
||||
<el-table-column prop="count_mongodb" label="Mongodb" sortable align="center" width="80" />
|
||||
<el-table-column prop="count_mem" label="总内存" sortable align="center" width="120" />
|
||||
<el-table-column prop="count_cpu" label="总CPU" sortable align="center" width="110" />
|
||||
<el-table-column prop="count_ecs" label="资源数" sortable align="center" width="100">
|
||||
|
@ -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: '' },
|
||||
|
|
Loading…
Reference in New Issue