Releases v0.8.1

pull/27/head
StarsL.cn 2022-07-26 04:37:58 +08:00
parent b049ad7495
commit 2369ebb4d2
4 changed files with 46 additions and 10 deletions

View File

@ -11,6 +11,7 @@ def create_node(jms_url,headers,now,node_id,cloud,account):
data = {'count': '失败','update':now,'status':50000,'msg':f'同步资源失败!{detail}'} data = {'count': '失败','update':now,'status':50000,'msg':f'同步资源失败!{detail}'}
consul_kv.put_kv(f'ConsulManager/record/jms/{cloud}/{account}', data) consul_kv.put_kv(f'ConsulManager/record/jms/{cloud}/{account}', data)
cloud_group_dict = consul_kv.get_value(f'ConsulManager/assets/{cloud}/group/{account}') cloud_group_dict = consul_kv.get_value(f'ConsulManager/assets/{cloud}/group/{account}')
cloud_group_dict['nogroup'] = '未分组'
for k,v in cloud_group_dict.items(): for k,v in cloud_group_dict.items():
if v not in [i['value'] for i in jms_node_list]: if v not in [i['value'] for i in jms_node_list]:
response = requests.request("POST", node_url, headers=headers, data = json.dumps({'value': v})) response = requests.request("POST", node_url, headers=headers, data = json.dumps({'value': v}))
@ -25,17 +26,18 @@ def update_jms_ecs(jms_url,headers,new_node_dict,node_id,cloud,account,ecs_info,
reget_ecs_list = requests.request("GET", f'{ecs_url}?node={node_id}', headers=headers).json() reget_ecs_list = requests.request("GET", f'{ecs_url}?node={node_id}', headers=headers).json()
jms_ecs_dict = {i['ip']:{'name':i['hostname'],'id':i['id'],'comment':i['comment'],'node':i['nodes_display'][0]} for i in reget_ecs_list} jms_ecs_dict = {i['ip']:{'name':i['hostname'],'id':i['id'],'comment':i['comment'],'node':i['nodes_display'][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}_ecs')['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} 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()]] 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()]]
for del_ecs in del_ecs_list: for del_ecs in del_ecs_list:
response = requests.request("DELETE", f'{ecs_url}{del_ecs}/', headers=headers) response = requests.request("DELETE", f'{ecs_url}{del_ecs}/', headers=headers)
print(' 【JMS】删除主机',del_ecs,response.status_code,flush=True) print(' 【JMS】删除主机:',del_ecs,response.status_code,flush=True)
#增加/更新缺少的主机 #增加/更新缺少的主机
for k,v in ecs_dict.items(): for k,v in ecs_dict.items():
ip = v['ip'] ip = v['ip']
iname = v['name'] iname = v['name']
nodes = new_node_dict[v['ent']] nodes = new_node_dict.get(v['ent'],new_node_dict['未分组'])
ostype = v['ostype'] ostype = v['ostype']
comment = f"{v['vendor']} {account} {v['region']} {k}" comment = f"{v['vendor']} {account} {v['region']} {k}"
protocols = ecs_info[ostype][0] protocols = ecs_info[ostype][0]
@ -60,13 +62,33 @@ def update_jms_ecs(jms_url,headers,new_node_dict,node_id,cloud,account,ecs_info,
"comment": comment "comment": comment
} }
if ip in jms_ecs_dict.keys(): if ip in jms_ecs_dict.keys():
if jms_ecs_dict[ip]['name'] != iname or jms_ecs_dict[ip]['node'].split('/')[-1] != v['ent']: jms_group = '' if jms_ecs_dict[ip]['node'].split('/')[-1] == '未分组' else jms_ecs_dict[ip]['node'].split('/')[-1]
if jms_ecs_dict[ip]['name'] != iname or jms_group != v['ent']:
response = requests.request("PUT", f"{ecs_url}{jms_ecs_dict[ip]['id']}/", headers=headers, data = json.dumps(payload)) response = requests.request("PUT", f"{ecs_url}{jms_ecs_dict[ip]['id']}/", headers=headers, data = json.dumps(payload))
print(' 【JMS】update主机名',response.json()['hostname'],response.status_code,flush=True) print(' 【JMS】update主机名:',response.json()['hostname'],response.status_code,flush=True)
else: else:
response = requests.request("POST", ecs_url, headers=headers, data = json.dumps(payload)) response = requests.request("POST", ecs_url, headers=headers, data = json.dumps(payload))
print(' 【JMS】add主机名',response.json()['hostname'],response.status_code,flush=True) print(' 【JMS】add主机名:',iname,ip,f"{response.json()['hostname']}{response.status_code}",flush=True)
return 'ok' 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/"
temp_jmsecs_dict = {}
rep_jmsecs_list = []
new_jms_list = requests.request("GET", f'{ecs_url}?node={node_id}', headers=headers).json()
for i in new_jms_list:
if i['ip'] not in temp_jmsecs_dict:
temp_jmsecs_dict[i['ip']] = {'name':i['hostname'],'id':i['id'],'ip':i['ip']}
else:
rep_jmsecs_list.append(temp_jmsecs_dict[i['ip']])
rep_jmsecs_list.append({'name':i['hostname'],'id':i['id'],'ip':i['ip']})
for j in rep_jmsecs_list:
if j['name'] != ecs_ip_dict.get(j['ip']):
del_ecs = j['id']
response = requests.request("DELETE", f'{ecs_url}{del_ecs}/', headers=headers)
print(' 【JMS】删除IP重复且名称不在ECS列表的主机:',j['name'],j['ip'],response.status_code,flush=True)
#从JMS中删除没有主机的组 #从JMS中删除没有主机的组
def del_node(jms_url,headers,now,node_id,cloud,account): def del_node(jms_url,headers,now,node_id,cloud,account):
@ -98,6 +120,7 @@ def run(cloud,account):
headers = {'Content-Type': 'application/json','Authorization': f"Token {token}"} headers = {'Content-Type': 'application/json','Authorization': f"Token {token}"}
new_node_dict = create_node(jms_url,headers,now,node_id,cloud,account) new_node_dict = create_node(jms_url,headers,now,node_id,cloud,account)
update_jms_ecs(jms_url,headers,new_node_dict,node_id,cloud,account,ecs_info,custom_ecs_info) ecs_ip_dict = update_jms_ecs(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) del_node(jms_url,headers,now,node_id,cloud,account)
print('【JOB】===>',cloud,account,'JMS同步完成',flush=True) print('【JOB】===>',cloud,account,'JMS同步完成',flush=True)

View File

@ -46,7 +46,7 @@ Object.keys(filters).forEach(key => {
}) })
Vue.config.productionTip = false Vue.config.productionTip = false
Vue.prototype.VER = 'v0.7.1' Vue.prototype.VER = 'v0.8.1'
new Vue({ new Vue({
el: '#app', el: '#app',

View File

@ -4,6 +4,18 @@
<el-link :underline="false" type="primary" icon="el-icon-star-on" href="https://github.com/starsliao/ConsulManager" target="_blank" class="dashboard-text">StarsL.cn</el-link> <el-link :underline="false" type="primary" icon="el-icon-star-on" href="https://github.com/starsliao/ConsulManager" target="_blank" class="dashboard-text">StarsL.cn</el-link>
</el-badge> </el-badge>
<el-timeline> <el-timeline>
<el-timeline-item timestamp="2022/7/26" placement="top">
<el-card>
<h4>v0.8.1</h4>
<p><el-button type="primary" size="mini" icon="el-icon-star-off" circle />新增自动同步云资产到JumpServer的功能</p>
<p>当我们在云厂商界面新增删除修改ECS后都会及时的自动同步到JumpServer中</p>
<p>并且在JumpServer各资产的备注中会记录丰富的资产信息方便查询筛选登录</p>
<p>同步页面提供了云账号ECS资产整体的系统资源状态信息</p>
<p>优化了站点监控管理页面的用户操作体验方便增加各类型的站点监控</p>
<p>关机的云主机也会同步到consul并加上tag标识默认不会接入Prometheus</p>
<p>优化后端镜像大小更新大量前端依赖修复漏洞</p>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="2022/7/3" placement="top"> <el-timeline-item timestamp="2022/7/3" placement="top">
<el-card> <el-card>
<h4>v0.7.0</h4> <h4>v0.7.0</h4>

View File

@ -13,7 +13,7 @@
<el-button class="filter-item" style="margin-left: 10px;" type="success" icon="el-icon-magic-stick" circle @click="resetData" /> <el-button class="filter-item" style="margin-left: 10px;" type="success" icon="el-icon-magic-stick" circle @click="resetData" />
</el-tooltip> </el-tooltip>
<el-button class="filter-item" type="primary" icon="el-icon-edit" @click="handleCreate">JumpServer</el-button> <el-button class="filter-item" type="primary" icon="el-icon-edit" @click="handleCreate">JumpServer</el-button>
<el-dialog :visible.sync="dialogFormVisible" width="40%"> <el-dialog :visible.sync="dialogFormVisible" width="44%">
<div slot="title" class="header-title"> <div slot="title" class="header-title">
<span style="font-size:16px;font-weight:bold;">接入JumpServer</span>&nbsp;&nbsp; <span style="font-size:16px;font-weight:bold;">接入JumpServer</span>&nbsp;&nbsp;
<el-link type="primary" href="https://github.com/starsliao/ConsulManager/blob/43c141f4373cb3288e213116a69b33820b6cce10/docs/%E5%A6%82%E4%BD%95%E6%8A%8A%E4%B8%BB%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%8C%E6%AD%A5%E5%88%B0JumpServer.md" target="_blank" icon="el-icon-question">如何填写</el-link> <el-link type="primary" href="https://github.com/starsliao/ConsulManager/blob/43c141f4373cb3288e213116a69b33820b6cce10/docs/%E5%A6%82%E4%BD%95%E6%8A%8A%E4%B8%BB%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%8C%E6%AD%A5%E5%88%B0JumpServer.md" target="_blank" icon="el-icon-question">如何填写</el-link>
@ -87,7 +87,7 @@
<el-form-item label="新节点ID"> <el-form-item label="新节点ID">
<el-input v-model="jms_sync.nodeid" /> <el-input v-model="jms_sync.nodeid" />
</el-form-item> </el-form-item>
<font size="3px" color="#ff0000">注意JumpServer中已有的同名主机不会同步</font> <font size="3px" color="#ff0000">注意每个云账号必须在JumpServer创建一个新节点<br><br>JumpServer中已有的同名主机不会同步日志可查看同名信息</font>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="fetchData"> <el-button @click="fetchData">
@ -187,6 +187,7 @@ export default {
this.listLoading = false this.listLoading = false
if (response.code === 20000) { if (response.code === 20000) {
this.dialogFormVisible = false this.dialogFormVisible = false
this.fetchData()
} }
this.$message({ this.$message({
message: response.data, message: response.data,