cmdb 表设计

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS AI 助手,专业版
RDS Agent(兼容OpenClaw),2核4GB
简介:

增删改查,最注重要是删和改。

1.主机表,应用表,主机应用关系表

主机表

DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ip` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'ip地址',
  `env` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '环境',
  `system` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '系统类型',
  `application` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '应用',
  `scu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '具体用途',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ip` (`ip`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='最先存入的所有主机表';

主机应用关系表

DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ipid` int(11) DEFAULT NULL,
  `applyid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=916 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

应用表

DROP TABLE IF EXISTS `pub_datadictionary`;
CREATE TABLE `pub_datadictionary` (
  `dd_no` varchar(38) COLLATE utf8mb4_unicode_ci NOT NULL,
  `dd_code` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '字典项代码',
  `dd_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '字典项名称',
  `dd_desc` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '描述',
  `is_lock` char(1) COLLATE utf8mb4_unicode_ci DEFAULT 'N' COMMENT '是否锁定:Y-锁定,N未锁定',
  PRIMARY KEY (`dd_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

DROP TABLE IF EXISTS `pub_dditem`;
CREATE TABLE `pub_dditem` (
  `item_no` varchar(38) COLLATE utf8mb4_unicode_ci NOT NULL,
  `item_code` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '常量值',
  `item_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '常量名称',
  `item_order` int(11) DEFAULT '999' COMMENT '排序值',
  `dd_no` varchar(38) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '所属数据字典项',
  `is_lock` char(1) COLLATE utf8mb4_unicode_ci DEFAULT 'N' COMMENT '是否锁定:Y-锁定,N未锁定',
  `is_sync` varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT 'N' COMMENT '是否同步',
  `parentno` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `itemdesc` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`item_no`),
  KEY `IDX_160_ITEMCODE` (`item_code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

查询的sql

SELECT
    d.item_name
FROM
    (
        SELECT
            b.applyid
        FROM
            b
        JOIN a ON b.ipid = a.id
        WHERE
            a.ip = '172.x.x.x'
    ) AS c
JOIN pub_dditem d ON c.applyid = d.item_no;

a
1 172.1.1.1 test Cloud mysql 数据库
2 172.1.1.2 test Cloud tomcat a+b+c,jenkins

b

pub_dditem
148 mysql mysql 46 100 N N 0 
149 tomcat a 47 101 N N 0
150 tomcat a 48 101 N N 0
151 tomcat a 49 101 N N 0

update_hosts_apply.xls
172.1.1.1 mysql
172.1.1.2 tomcat(crm+workflow+service)

python小脚本初始化(仅仅是插入)

# !/usr/bin/env python
# coding:utf-8
import json
import urllib2
from urllib2 import URLError
import sys
import xlrd
import MySQLdb as mdb

def conn(ip,user,password,database):
    con = mdb.connect(ip,user,password,database)
    cur = con.cursor()
    return cur

def select(cur,sql):
    cur.execute(sql)
    return cur.fetchall()

def insert(cur,xls):
    workbook = xlrd.open_workbook(xls)
    for row in xrange(workbook.sheets()[0].nrows):
        ip = workbook.sheets()[0].cell(row, 0).value
        applys = workbook.sheets()[0].cell(row, 1).value
        for apply in applys.split(','):
            if 'tomcat' in apply:
                tomcat_apply = apply.split('(')[1].split(')')[0].split('+')
                for ztomcat_apply in tomcat_apply:
                    sql = "select item_no from pub_dditem where item_code='tomcat' and item_name='%s' " % (
                    ztomcat_apply)
                    sql1 = "select id from a where ip='%s'" % (ip)
                    for r in select(cur, sql):
                        item_no = r[0]
                    for r in select(cur, sql1):
                        id = r[0]
                    sql2 = "insert into  b (ipid,applyid) values(%d,%d)" % (int(id), int(item_no))
                    sql3 = "select * from b where ipid = '%s' and applyid = '%s'" % (id, item_no)
                    flag = cur.execute(sql3)
                    if flag == 0L:
                        cur.execute(sql2)
                        con.commit()

            else:
                sql = "select item_no from pub_dditem where item_name='%s' " % (apply)
                sql1 = "select id from a where ip='%s'" % (ip)
                for r in select(cur, sql):
                    item_no = r[0]
                for r in select(cur, sql1):
                    id = r[0]
                sql2 = "insert into b (ipid,applyid) values(%d,%d)" % (int(id), int(item_no))
                sql3 = "select * from b where ipid = '%s' and applyid = '%s'" % (id, item_no)
                flag = cur.execute(sql3)
                if flag == 0L:
                    cur.execute(sql2)
                    con.commit()

if __name__ == "__main__":
    con = mdb.connect('db', 'root', 'password', 'cmdb')
    cur = con.cursor()
    insert(cur,'update_hosts_apply.xls')
    cur.close()

还有的问题:
1.初始化数据一定要准确,不然执行到b表会重复
2.录入的xls也要准确,比如出现写错应用的,那么b表也会重复



本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/2074648,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 Java 文件存储
如何用 Java 压缩 ZIP 文件?
【2月更文挑战第21天】
1033 1
|
前端开发 测试技术 数据库
DDD架构中assembler和converter的区别
在 DDD 四层架构模式中,assembler 和 converter 常用于对象转换,但两者在实际项目中的使用较为随意。本文从英文释义、语义区分和模型层区分三个方面探讨了两者的区别,建议按模型层区分,即 Interface 和 Application 层使用 assembler,Infrastructure 层使用 converter,以避免混淆和随意使用。此外,将转换代码抽离为独立方法有助于保持代码整洁和可测试性。
|
存储 安全 小程序
DaaS架构及落地 (一)
DaaS 数据即服务是一种服务模式,即将数据以服务的形式,向客户提供价值,参与到客户的业务中,它也是软件即服务的一种细分领域。同时DaaS 拥有云计算的通用特点,包括以租代买,按需付费、按用付费。 本文介绍 DaaS 的架构及实现选择,对于拥有大量优质数据资源的企业,可以参考构建起数据业务线,进而实现数据的资产化、价值化。需要说明的是本文中的各种图例仅是逻辑示意,均做了简化。
1874 1
DaaS架构及落地 (一)
|
关系型数据库 MySQL 数据安全/隐私保护
mysql8.0.26忘记密码后重置(centos8)
mysql8.0.26忘记密码后重置(centos8)
947 2
|
监控 数据可视化 安全
「译文」CMDB 最佳实践技术指南 -1-CMDB 可视化 - 最佳实践与示例
「译文」CMDB 最佳实践技术指南 -1-CMDB 可视化 - 最佳实践与示例
|
网络协议 Linux Windows
计算机网络抓包工具——tcpdump详解
计算机网络抓包工具——tcpdump详解
|
安全 Linux Docker
制作 Python Docker 镜像的最佳实践
制作 Python Docker 镜像的最佳实践
|
JavaScript
vue3报错:runtime-core.esm-bundler.js:38 [Vue warn]: Invalid prop: type check failed for prop “modelVal
vue3报错:runtime-core.esm-bundler.js:38 [Vue warn]: Invalid prop: type check failed for prop “modelVal
6971 1
|
运维 监控 安全
《云上业务稳定性保障实践白皮书》——四. 变更管控体系——4.1 变更标准流程规范
《云上业务稳定性保障实践白皮书》——四. 变更管控体系——4.1 变更标准流程规范
1118 0
|
存储 自然语言处理 Dubbo
几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
新项目查日志太麻烦,多台机器之间查来查去,还不知道是不是同一个请求的。打印日志时使用 MDC 在日志上添加一个 traceId,那这个 traceId 如何跨系统传递呢?
1514 0