CMDB運維自動化
阿新 • • 發佈:2018-11-05
最近用flask寫了一個CMDB資產管理工具(前端有其他同事編寫,這裡不做具體介紹)
這裡是放置自動更新資產的模組,當有新的資源增加的時候,定時器會定期拉取線上資源並錄入資料庫,同時通過線上監控API加入監控,完全不用人工參與附屬部分程式碼:
def auto_update_rds(): result = [] for zone in zones: #獲取rds所有InstanceId nums = get_rds_totalcount(zone) if nums > 0: for i inrange(nums): lists = get_rds_instanceid(zone, i+1) for line in lists: date = ( line.get('DBInstanceId') ) result.append(date) #獲取資料庫下所有InstanceId db_ins = ModifyDatabase() rds_id = db_ins.get_mysql_ecs_id('ali_rds') rds_lists = [] for i in range(len(rds_id)): rds_lists.append(rds_id[i][0]) i = i + 1 diff1 = list(set(result).difference(set(rds_lists))) #獲取未錄入資料庫的InstanceId print ('未錄入的rds數量:' + str(len(diff1))) if len(diff1) > 0: #封裝好的監控介面 cms = auto_add_cms() type = "RDS"for L in range(len(diff1)): #自動錄入資料庫 rds_info = get_rds_info('cn-hangzhou', diff1[L]) db_ins = ModifyDatabase() db_ins.insert_rds_table(**rds_info) #自動加入監控,根據不同的描述加入到不同的監控組 if 'prod' in rds_info['name'].lower(): GroupId = xxxxx cms_list = cms.get_all_cms_list(GroupId) #判斷監控中是否存在相同InstanceId if rds_info['InstanceId'] not in cms_list: zone = rds_info['region'] InstanceId = rds_info['InstanceId'] cms.add_cms(zone, GroupId, InstanceId, type) else: GroupId = xxxxx cms_list = cms.get_all_cms_list(GroupId) if rds_info['InstanceId'] not in cms_list: zone = rds_info['region'] InstanceId = rds_info['InstanceId'] cms.add_cms(zone, GroupId, InstanceId, type) diff2 = list(set(rds_lists).difference(set(result))) # 自動刪除功能 if len(diff2) > 0: print('rds過期數量:' + str(len(diff2))) db_ins.delete_resource_info("ali_rds", "instance_id", ",".join(diff2)) #定時器 global timer timer = threading.Timer(86400, auto_update_rds) timer.start()
下面介紹路由資訊(這裡主要分享:返回給前端的資料介面):
@app.route("/getresource", methods=["GET"])
env = request.args["Env"] res = request.args["Res"] app.logger.debug("[getresource]In {} for resource {}".format(env, res)) db_ins = ModifyDatabase() data = [] if env == "Ali": if res == "Ecs": infos = db_ins.get_product_info("ali_vm") data = formatAliEcs(infos) elif res == "Rds": infos = db_ins.get_product_info("ali_rds") data = formatAliRds(infos) elif res == "Slb": infos = db_ins.get_product_info("ali_slb") data = formatAliSlb(infos) elif res == "Mongo": infos = db_ins.get_product_info("ali_mongo") data = formatAliMongo(infos) elif res == "Redis": infos = db_ins.get_product_info("ali_redis") data = formatAliRedis(infos) elif res == "Memcache": infos = db_ins.get_product_info("ali_memcache") data = formatAliMemcache(infos) elif res == "Cdn": infos = db_ins.get_product_info("ali_cdn") data = formatAliCdn(infos) elif env == "Inner": if res == "Ecs": infos = db_ins.get_product_info("inner_vm") data = formatInnerVm(infos) elif res == "Pm": infos = db_ins.get_product_info("innerserver") data = formatInnerPm(infos) elif res == "Switch": infos = db_ins.get_product_info("innerswitch") data = formatInnerSwitch(infos) elif res == "Domain": infos = db_ins.get_product_info("domain") data = formatInnerDomain(infos) r = json.dumps(data) return Response( response=r, mimetype="application/json", status=200 )
前端傳過來兩個引數分別對應是內部資源還是雲平臺的資源以及資源型別,然後從資料庫獲取資源、格式化成json返回給前端展示
效果圖:
其他功能(資源自動化錄入、自動加入報警組、消費報表自動統計、工單系統等),如果有興趣的可以留言,有時間一起討論,後續整理下基於伺服器效能,docker-swarm下容器的自動伸縮
最終形態:自動加入新增資訊+自動監控+自動擴容+(後期的配置系統),這樣你的cmdb已經小有所成啦!希望這個思路對大家有所幫助