# tianyi **Repository Path**: mythink/tianyi ## Basic Information - **Project Name**: tianyi - **Description**: 天一运维平台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2020-11-12 - **Last Updated**: 2023-08-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 天一运维平台架构说明 ## 项目背景 ​ 我们处在互联网信息时代,应当倍感荣幸, 各种开源技术层出不穷,学习资源非常丰富,同时,也感到迷茫,大数据,云计算,人工智能,究竟应该选择哪个领域去专研?哪项技术最有发展前途?这是非常艰难的选择。 ​ 不如,我们换个角度,现在有个项目摆在眼前--《天一运维平台》。项目需要用到各种技术,前端,后端,数据库,需要用到什么技术,就去学什么技术,项目驱动学习,学以致用,理论和实践相结合,才是最快的学习方法。 ​ **一个人最大的幸运,莫过于站在了浪潮之巅,这样他可以顺势而为,在大时代里成就一番事业。 --吴军** ## 需求分析 ​ 企业运维发展趋势从一开始的人工运维,发展到自动化运维(Devops),再到最近兴起的智能运维(AIOps)。先进的运维方式都离不开运维平台的支撑,运维平台好处诸多,人员管理,资产管理,脚本管理,资源监控,日志查询,数据分析等等。甚至可以集成代码仓库,容器仓库,将网站服务自动部署到UAT环境和生产环境,也就是CICD持续集成与部署。 ​ 由于项目刚刚起步,可以先把框架搭好,添加最基础的功能,先跑起来,然后再不断迭代,一点一点添加新功能。每次只设计和实现这个产品的一部分, 逐步逐步完成的方法叫迭代开发, 每次设计和实现一个阶段叫做一个迭代。 ## 功能说明 > ​ 目前先做以下3个功能: ### 人员管理 ​ 人员管理是指,对使用运维平台的人员进行统一权限管理,包括管理员,项目经理,开发人员,运维人员,测试人员等。 ### 主机管理 ​ 主机管理包括公司内部所有服务器的资产编号,品牌型号,主机名,操作系统,内存,CPU,用户名,密码,磁盘空间,IP地址,主要用途等等。 ### 脚本管理 ​ 服务器脚本包括shell, python脚本,需要记录脚本名,作者,联系方式,脚本用途,脚本参数等。并且在这个基础上,可以批量指定服务器来执行脚本,包括定时执行,重复执行,并且可以查询到每次的执行人和执行结果。 ## 数据建模 > ​ 建模工具使用Mysql Workbench ### 表结构设计 每个用户有自己的用户详情,一对一关系。 每个用户可以写多个脚本,一对多关系。 每个用户可以使用多台主机,每台主机可以被多个用户使用,多对多关系。 ### 表关联关系 ![relation](image/relation.png) ### 建表SQL ```sql -- MySQL Script generated by MySQL Workbench -- 2020年11月13日 星期五 14时01分12秒 -- Model: New Model Version: 1.0 -- MySQL Workbench Forward Engineering SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; -- ----------------------------------------------------- -- Schema mydb -- ----------------------------------------------------- -- ----------------------------------------------------- -- Schema tianyi -- ----------------------------------------------------- -- ----------------------------------------------------- -- Schema tianyi -- ----------------------------------------------------- CREATE SCHEMA IF NOT EXISTS `tianyi` DEFAULT CHARACTER SET utf8mb4 ; USE `tianyi` ; -- ----------------------------------------------------- -- Table `tianyi`.`USER` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `tianyi`.`USER` ( `work_id` INT(11) NOT NULL COMMENT '工号', `name` VARCHAR(32) NULL DEFAULT NULL COMMENT '用户名', `password` VARCHAR(32) NULL DEFAULT NULL COMMENT '密码', `telphone` VARCHAR(32) NULL DEFAULT NULL COMMENT '手机号', PRIMARY KEY (`work_id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '用户表'; -- ----------------------------------------------------- -- Table `tianyi`.`DETAIL` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `tianyi`.`DETAIL` ( `work_id` INT(11) NOT NULL COMMENT '员工号', `sex` INT(11) NOT NULL COMMENT '性别', `age` INT(11) NULL DEFAULT NULL COMMENT '年龄', `position` VARCHAR(32) NULL DEFAULT NULL COMMENT '职位', `created_time` DATETIME NULL DEFAULT NULL COMMENT '创建日期', PRIMARY KEY (`work_id`), CONSTRAINT `fk_DETAIL_1` FOREIGN KEY (`work_id`) REFERENCES `tianyi`.`USER` (`work_id`) ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '用户详情表'; -- ----------------------------------------------------- -- Table `tianyi`.`SCRIPT` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `tianyi`.`SCRIPT` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `s_name` VARCHAR(32) NOT NULL COMMENT '脚本名', `description` VARCHAR(32) NULL DEFAULT NULL COMMENT '脚本说明', `content` TEXT NULL DEFAULT NULL COMMENT '脚本内容', `created_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间', `work_id` INT(11) NULL DEFAULT NULL COMMENT '创建人', PRIMARY KEY (`id`), INDEX `fk_SCRIPT_1_idx` (`work_id` ASC) , CONSTRAINT `fk_SCRIPT_1` FOREIGN KEY (`work_id`) REFERENCES `tianyi`.`USER` (`work_id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '脚本表'; -- ----------------------------------------------------- -- Table `tianyi`.`SERVER` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `tianyi`.`SERVER` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `hostname` VARCHAR(32) NOT NULL COMMENT '主机名', `os` VARCHAR(32) NOT NULL DEFAULT 'Centos7' COMMENT '操作系统', `memory` VARCHAR(32) NOT NULL COMMENT '内存', `cpu` VARCHAR(32) NOT NULL COMMENT 'CPU', `ip` VARCHAR(32) NOT NULL COMMENT 'IP地址', `operator` VARCHAR(32) NULL DEFAULT NULL COMMENT '用户名', `password` VARCHAR(32) NULL DEFAULT NULL COMMENT '密码', `vmspace` VARCHAR(32) NULL DEFAULT NULL COMMENT '存储空间', `function` VARCHAR(128) NULL DEFAULT NULL COMMENT '主要用途', PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '主机表'; -- ----------------------------------------------------- -- Table `tianyi`.`USER_SERVER` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `tianyi`.`USER_SERVER` ( `id` INT(11) NOT NULL COMMENT 'ID', `work_id` INT(11) NOT NULL COMMENT 'WORK_ID', `server_id` INT(11) NOT NULL COMMENT 'SERVER_ID', PRIMARY KEY (`id`), INDEX `fk_USER_SERVER_1_idx` (`work_id` ASC) , INDEX `fk_USER_SERVER_2_idx` (`server_id` ASC) , CONSTRAINT `fk_USER_SERVER_1` FOREIGN KEY (`work_id`) REFERENCES `tianyi`.`USER` (`work_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_USER_SERVER_2` FOREIGN KEY (`server_id`) REFERENCES `tianyi`.`SERVER` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '用户主机关系表'; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; ``` ### 逆向生成Django模型 ```shell #如果表已存在,可以逆向生成Django模型 python manage.py inspectdb >models.py #反之,如果先写Django模型,再迁移数据,也是可行的 #python manage.py makemigrations #python manage.py migrate ``` ```python #models.py # This is an auto-generated Django model module. # You'll have to do the following manually to clean this up: # * Rearrange models' order # * Make sure each model has one field with primary_key=True # * Make sure each ForeignKey has `on_delete` set to the desired behavior. # * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table # Feel free to rename the models, but don't rename db_table values or field names. from django.db import models class Detail(models.Model): work = models.ForeignKey('User', models.DO_NOTHING, primary_key=True) sex = models.IntegerField() age = models.IntegerField(blank=True, null=True) position = models.CharField(max_length=32, blank=True, null=True) created_time = models.DateTimeField(blank=True, null=True) class Meta: managed = False db_table = 'DETAIL' class Script(models.Model): s_name = models.CharField(max_length=32) description = models.CharField(max_length=32, blank=True, null=True) content = models.TextField(blank=True, null=True) created_time = models.DateTimeField(blank=True, null=True) work = models.ForeignKey('User', models.DO_NOTHING, blank=True, null=True) class Meta: managed = False db_table = 'SCRIPT' class Server(models.Model): hostname = models.CharField(max_length=32) os = models.CharField(max_length=32) memory = models.CharField(max_length=32) cpu = models.CharField(max_length=32) ip = models.CharField(max_length=32) operator = models.CharField(max_length=32, blank=True, null=True) password = models.CharField(max_length=32, blank=True, null=True) vmspace = models.CharField(max_length=32, blank=True, null=True) function = models.CharField(max_length=128, blank=True, null=True) class Meta: managed = False db_table = 'SERVER' class User(models.Model): work_id = models.IntegerField(primary_key=True) name = models.CharField(max_length=32, blank=True, null=True) password = models.CharField(max_length=32, blank=True, null=True) telphone = models.CharField(max_length=32, blank=True, null=True) class Meta: managed = False db_table = 'USER' class UserServer(models.Model): id = models.IntegerField(primary_key=True) work = models.ForeignKey(User, models.DO_NOTHING) server = models.ForeignKey(Server, models.DO_NOTHING) class Meta: managed = False db_table = 'USER_SERVER' ``` ### 测试数据SQL ## 前端设计 ## 后端框架 ## 开发过程 ## 服务部署 ## 网站维护 ## 平台赞助