Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
整理代码多余部分
Browse files Browse the repository at this point in the history
重写timeline部分常量
新增QRCode过期时间计算
  • Loading branch information
yo committed Oct 30, 2018
1 parent 0c6a00f commit 5a2f075
Show file tree
Hide file tree
Showing 197 changed files with 10,928 additions and 10,739 deletions.
236 changes: 118 additions & 118 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,118 +1,118 @@
devEops :laughing: 开发自运维平台 :no_mouth: 后端
================================
[![Travis Build Status](https://travis-ci.org/YoLoveLife/DevOps.svg?branch=master)](https://travis-ci.org/YoLoveLife/DevOps)
[![Github All Releases](https://img.shields.io/github/downloads/atom/atom/total.svg)](https://github.com/YoLoveLife/devEops/releases)
[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE.md) :yum: </br>

Author: [YoLoveLife.com](http://www.yolovelife.com) :ok_hand: 汪子哲 :fist: 徐晨亮 :facepunch: 张宇萍</br>
:heart: 感谢所有 :star: 我的人 你们是我前行的动力</br>
该项目为devEops的后端部分 前端部分请关注 :heart: [devEops-Web](https://github.com/YoLoveLife/devEopsWeb)</br>

运维体系解决方案(正在成长中)</br>
前后段分离啦!告别之前的Jinja2</br>
:muscle: 实践以资产、应用信息为中心的运维平台</br>
django模型 & rest-framework</br>
:muscle: 参考了诸多django项目 我的Django用的真的很棒</br>
travis & django TestCase</br>
:muscle: 单元测试 测试不规范但是努力去做

如果你关注:自动化运维、运维资源管理等内容 :star: 我,[分享](http://www.yolovelife.com)给其他的运维人员</br>
如果你关注:django开发、rest-framework等内容 :star: 我,[分享](http://www.yolovelife.com)给其他的开发者</br>
求求你们 :star: 我吧!!! 求求你们 :star: 我吧!!! 求求你们 :star: 我吧!!!</br>

*关于我开发中遇到的问题 我会写在issues当中供有需要的朋友 :mag: 查询*</br>
*这些问题都是在查询了诸多资料并亲身尝试大量解决方案 :grimacing: 最后得出的结论*</br>
*您可以在issues中搜索**helper**查看我写的相关问题 我写的很用心*</br>
*如果未找到您关注的问题或者您对我的项目有建议请在issues和我讨论 :heart: 期待收到您的信息*</br>

## Contents
* [介绍](#introduce)
* [平台一览](#looklike)
* [如何安装](#howtoinstall)
* [自运维功能实现](#whatcando)
## <a name="introduce"> 介绍 </a>
本开发自运维平台致力于IT资源信息的整合与自动化运维,通过服务、应用配置的信息整合来运维提供帮助。</br>
devEops正在不断成长
- 所有运维操作都基于信息整合的正确性和一致性(资产信息管理) :floppy_disk: </br>
- 对接VMware|Aliyun自动拉取信息入库资产 </br>
- :bar_chart: 提供各类信息统计图表(资产|运维)等</br>
- 基于Ansile的运维元操作|任务的定义</br>
- 基于WebSocket以及SSHProxy的工单操作 </br>
- 基于Django自带auth认证体系的资产与权限关联</br>
- 域名管理与解析信息查询与刷新</br>
- 详细权限操作,区分开发人员以及运维人员 </br>

## <a name="looklike"> 平台一览 </a>
### :muscle: 登陆界面
![LOGIN](img/login.png)</br>

### :muscle: 仪表盘界面
:satisfied: 根据资源的检出位置|操作系统类型|运维操作 等图表化展现</br>
并且每周提供可供保存的静态页面的报告 **有!但是很丑** :grin:
![DASHBOARD](img/dashboard.png)

### :muscle: 资产管理
:open_mouth: 资产根据来源(VMWARE|ALIYUN)入库 **运维人员进行归类**
![GROUP](img/group.png)</br>
应用组可定义架构图 关联跳板机以及密钥 :key: </br>
**应用组可全局添加参数 该参数会注入运维操作中的变量中**</br>
![HOST](img/host.png)
主机可以根据任意信息进行检索</br>
根据VMware|ALIYUN **API可进行详细信息(监控|配置)获取查看**</br>

### :muscle: 域名管理
基于树结构的域名管理 :relieved: 定时解析域名 保证记录域名解析正确 **供正反向查询**
![DNS](img/dns.png)

### :muscle: 密钥管理
**基于服务器端直接生成的ssh-rsa密钥** 私钥将会直接加密存储入数据库</br>
只有当您做运维操作|SSH连接的时候才会解析并且使用 :expressionless: </br>
![KEY](img/key.png)

### :muscle: QR-Code
基于Google-Authority的**二次验证** :confused: 目前用户体系中已经包含验证+生成</br>
![QRCODE](img/qrcode.png)

### :muscle: 元操作及任务
基于Ansible的数据模型 将用户的Ansible直接存储入数据库中</br>
当用户使用任务直接从CMDB中导出需要执行的主机列表以及参数列表 :smirk: **注入Ansible-API中**</br>
![META](img/meta.png)
选择元操作所涉及的主机范围 :neutral_face: </br>
![META](img/meta_bt.png)
选择某个应用组下的若干个元操作组成一个任务</br>
![MISSION](img/mission.png)

### :muscle: 工单系统
用户根据自身权限可以发布工单(涉及任务)进行执行</br>
![CODEWORK](img/work.png)
选择工单后用户可以进行执行 :punch: 系统**建立websocket**将所有执行结果返回
![RUN](img/run.png)

## <a name="howtoinstall"> 如何安装 </a>
devEops依赖于python3.5、诸多python第三方模块、mysql数据库、redis缓存</br>
以下操作环境已经拥有python3.5、mysql数据库、redis缓存
```bash
$ cd path/to/project/folder/

#安装部分依赖
yum install openssl-devel python3-devel openldap-devel

#安装python第三方库
$ pip install -r requirements.txt

#修改SSH的连接属性
$ vim /etc/ssh/ssh_config **注意是ssh_config而非sshd_config**
$ StrictHostKeyChecking no # 关闭指纹识别
$ :wq

#连接本地资源并创建数据表结构
$ vim deveops/conf.py #里面包含了所有连接数据以及定时任务 请填写您需要的数据内容
$ python manage.py makemigrations
$ python manage.py migrate

#启动服务
$ python manage.py runserver &
#默认启动在8000端口 你可能需要一个nginx做Web服务器
请务必配置一下Nginx代理来限制project/media下的访问权限 否则重要信息泄露的问题
```
## <a name="whatcando"> 自运维功能实现 </a>
devEops :laughing: 开发自运维平台 :no_mouth: 后端
================================
[![Travis Build Status](https://travis-ci.org/YoLoveLife/DevOps.svg?branch=master)](https://travis-ci.org/YoLoveLife/DevOps)
[![Github All Releases](https://img.shields.io/github/downloads/atom/atom/total.svg)](https://github.com/YoLoveLife/devEops/releases)
[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE.md) :yum: </br>

Author: [YoLoveLife.com](http://www.yolovelife.com) :ok_hand: 汪子哲 :fist: 徐晨亮 :facepunch: 张宇萍</br>
:heart: 感谢所有 :star: 我的人 你们是我前行的动力</br>
该项目为devEops的后端部分 前端部分请关注 :heart: [devEops-Web](https://github.com/YoLoveLife/devEopsWeb)</br>

运维体系解决方案(正在成长中)</br>
前后段分离啦!告别之前的Jinja2</br>
:muscle: 实践以资产、应用信息为中心的运维平台</br>
django模型 & rest-framework</br>
:muscle: 参考了诸多django项目 我的Django用的真的很棒</br>
travis & django TestCase</br>
:muscle: 单元测试 测试不规范但是努力去做

如果你关注:自动化运维、运维资源管理等内容 :star: 我,[分享](http://www.yolovelife.com)给其他的运维人员</br>
如果你关注:django开发、rest-framework等内容 :star: 我,[分享](http://www.yolovelife.com)给其他的开发者</br>
求求你们 :star: 我吧!!! 求求你们 :star: 我吧!!! 求求你们 :star: 我吧!!!</br>

*关于我开发中遇到的问题 我会写在issues当中供有需要的朋友 :mag: 查询*</br>
*这些问题都是在查询了诸多资料并亲身尝试大量解决方案 :grimacing: 最后得出的结论*</br>
*您可以在issues中搜索**helper**查看我写的相关问题 我写的很用心*</br>
*如果未找到您关注的问题或者您对我的项目有建议请在issues和我讨论 :heart: 期待收到您的信息*</br>

## Contents
* [介绍](#introduce)
* [平台一览](#looklike)
* [如何安装](#howtoinstall)
* [自运维功能实现](#whatcando)
## <a name="introduce"> 介绍 </a>
本开发自运维平台致力于IT资源信息的整合与自动化运维,通过服务、应用配置的信息整合来运维提供帮助。</br>
devEops正在不断成长
- 所有运维操作都基于信息整合的正确性和一致性(资产信息管理) :floppy_disk: </br>
- 对接VMware|Aliyun自动拉取信息入库资产 </br>
- :bar_chart: 提供各类信息统计图表(资产|运维)等</br>
- 基于Ansile的运维元操作|任务的定义</br>
- 基于WebSocket以及SSHProxy的工单操作 </br>
- 基于Django自带auth认证体系的资产与权限关联</br>
- 域名管理与解析信息查询与刷新</br>
- 详细权限操作,区分开发人员以及运维人员 </br>

## <a name="looklike"> 平台一览 </a>
### :muscle: 登陆界面
![LOGIN](img/login.png)</br>

### :muscle: 仪表盘界面
:satisfied: 根据资源的检出位置|操作系统类型|运维操作 等图表化展现</br>
并且每周提供可供保存的静态页面的报告 **有!但是很丑** :grin:
![DASHBOARD](img/dashboard.png)

### :muscle: 资产管理
:open_mouth: 资产根据来源(VMWARE|ALIYUN)入库 **运维人员进行归类**
![GROUP](img/group.png)</br>
应用组可定义架构图 关联跳板机以及密钥 :key: </br>
**应用组可全局添加参数 该参数会注入运维操作中的变量中**</br>
![HOST](img/host.png)
主机可以根据任意信息进行检索</br>
根据VMware|ALIYUN **API可进行详细信息(监控|配置)获取查看**</br>

### :muscle: 域名管理
基于树结构的域名管理 :relieved: 定时解析域名 保证记录域名解析正确 **供正反向查询**
![DNS](img/dns.png)

### :muscle: 密钥管理
**基于服务器端直接生成的ssh-rsa密钥** 私钥将会直接加密存储入数据库</br>
只有当您做运维操作|SSH连接的时候才会解析并且使用 :expressionless: </br>
![KEY](img/key.png)

### :muscle: QR-Code
基于Google-Authority的**二次验证** :confused: 目前用户体系中已经包含验证+生成</br>
![QRCODE](img/qrcode.png)

### :muscle: 元操作及任务
基于Ansible的数据模型 将用户的Ansible直接存储入数据库中</br>
当用户使用任务直接从CMDB中导出需要执行的主机列表以及参数列表 :smirk: **注入Ansible-API中**</br>
![META](img/meta.png)
选择元操作所涉及的主机范围 :neutral_face: </br>
![META](img/meta_bt.png)
选择某个应用组下的若干个元操作组成一个任务</br>
![MISSION](img/mission.png)

### :muscle: 工单系统
用户根据自身权限可以发布工单(涉及任务)进行执行</br>
![CODEWORK](img/work.png)
选择工单后用户可以进行执行 :punch: 系统**建立websocket**将所有执行结果返回
![RUN](img/run.png)

## <a name="howtoinstall"> 如何安装 </a>
devEops依赖于python3.5、诸多python第三方模块、mysql数据库、redis缓存</br>
以下操作环境已经拥有python3.5、mysql数据库、redis缓存
```bash
$ cd path/to/project/folder/

#安装部分依赖
yum install openssl-devel python3-devel openldap-devel

#安装python第三方库
$ pip install -r requirements.txt

#修改SSH的连接属性
$ vim /etc/ssh/ssh_config **注意是ssh_config而非sshd_config**
$ StrictHostKeyChecking no # 关闭指纹识别
$ :wq

#连接本地资源并创建数据表结构
$ vim deveops/conf.py #里面包含了所有连接数据以及定时任务 请填写您需要的数据内容
$ python manage.py makemigrations
$ python manage.py migrate

#启动服务
$ python manage.py runserver &
#默认启动在8000端口 你可能需要一个nginx做Web服务器
请务必配置一下Nginx代理来限制project/media下的访问权限 否则重要信息泄露的问题
```
## <a name="whatcando"> 自运维功能实现 </a>
10 changes: 5 additions & 5 deletions apps/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
# Time 06 09:22
# Author Yo
# Email YoLoveLife@outlook.com
# -*- coding:utf-8 -*-
# !/usr/bin/env python
# Time 06 09:22
# Author Yo
# Email YoLoveLife@outlook.com
from __future__ import absolute_import
4 changes: 2 additions & 2 deletions apps/audient/admin.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
from django.contrib import admin
# Register your models here.
from django.contrib import admin
# Register your models here.
20 changes: 10 additions & 10 deletions apps/audient/apps.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from __future__ import unicode_literals
from django.apps import AppConfig

__all__ = [
"AudientConfig"
]


class AudientConfig(AppConfig):
name = 'audient'
from __future__ import unicode_literals
from django.apps import AppConfig

__all__ = [
"AudientConfig"
]


class AudientConfig(AppConfig):
name = 'audient'
28 changes: 14 additions & 14 deletions apps/audient/models.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# -*- coding:utf-8 -*-
from __future__ import unicode_literals
from django.db import models
import uuid
from authority.models import ExtendUser

__all__ = [
]


class Audient(models.Model):
id = models.AutoField(primary_key=True)
uuid = models.UUIDField(auto_created=True, default=uuid.uuid4, editable=False)
channel = models.IntegerField(max_length=100, default='email')
# -*- coding:utf-8 -*-
from __future__ import unicode_literals
from django.db import models
import uuid
from authority.models import ExtendUser

__all__ = [
]


class Audient(models.Model):
id = models.AutoField(primary_key=True)
uuid = models.UUIDField(auto_created=True, default=uuid.uuid4, editable=False)
channel = models.IntegerField(max_length=100, default='email')
user = models.OneToOneField(ExtendUser, related_name='src_safe_work', on_delete=models.SET_NULL, null=True, blank=True)
24 changes: 12 additions & 12 deletions apps/audient/tasks.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
# Time 17-10-25
# Author Yo
# Email YoLoveLife@outlook.com
from __future__ import absolute_import, unicode_literals
from celery.task import periodic_task
from celery.schedules import crontab


@periodic_task(run_every=crontab(minute='*'))
def email_audient():
# -*- coding:utf-8 -*-
# !/usr/bin/env python
# Time 17-10-25
# Author Yo
# Email YoLoveLife@outlook.com
from __future__ import absolute_import, unicode_literals
from celery.task import periodic_task
from celery.schedules import crontab


@periodic_task(run_every=crontab(minute='*'))
def email_audient():
pass
16 changes: 8 additions & 8 deletions apps/audient/urls/api_urls.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from django.urls import path
from ..api import monitor as MonitorAPI
urlpatterns=[
# Resource host api
path(r'v1/host/<uuid:pk>/cpu/aliyun/byuuid/<int:time>/', MonitorAPI.MonitorHostAliyunDetailCPUAPI.as_view()),
path(r'v1/host/<uuid:pk>/memory/aliyun/byuuid/<int:time>/', MonitorAPI.MonitorHostAliyunDetailMemoryAPI.as_view()),
path(r'v1/host/<uuid:pk>/disk/read/aliyun/byuuid/<int:time>/', MonitorAPI.MonitorHostAliyunDetailIReadIOPS.as_view()),
path(r'v1/host/<uuid:pk>/internet/in/aliyun/byuuid/<int:time>/', MonitorAPI.MonitorHostAliyunDetailInternetInRate.as_view()),
from django.urls import path
from ..api import monitor as MonitorAPI
urlpatterns=[
# Resource host api
path(r'v1/host/<uuid:pk>/cpu/aliyun/byuuid/<int:time>/', MonitorAPI.MonitorHostAliyunDetailCPUAPI.as_view()),
path(r'v1/host/<uuid:pk>/memory/aliyun/byuuid/<int:time>/', MonitorAPI.MonitorHostAliyunDetailMemoryAPI.as_view()),
path(r'v1/host/<uuid:pk>/disk/read/aliyun/byuuid/<int:time>/', MonitorAPI.MonitorHostAliyunDetailIReadIOPS.as_view()),
path(r'v1/host/<uuid:pk>/internet/in/aliyun/byuuid/<int:time>/', MonitorAPI.MonitorHostAliyunDetailInternetInRate.as_view()),
]
28 changes: 14 additions & 14 deletions apps/audient/urls/socket_urls.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# -*- coding:utf-8 -*-
# !/usr/bin/env python
# Time 18-1-11
# Author Yo
# Email YoLoveLife@outlook.com
# from channels.routing import route
from manager import consumers
from django.conf.urls import url
# manager_routing = [
# consumers.ManagerConsumer.as_route(path=r'^/(?P<pk>[0-9]+)/wds/(?P<cols>[0-9]+)/(?P<rows>[0-9]+)/$'),
# ]

manager_routing = [
url(r'^/(?P<pk>[0-9]+)/wds/(?P<cols>[0-9]+)/(?P<rows>[0-9]+)/$', consumers.ManagerConsumer)
# -*- coding:utf-8 -*-
# !/usr/bin/env python
# Time 18-1-11
# Author Yo
# Email YoLoveLife@outlook.com
# from channels.routing import route
from manager import consumers
from django.conf.urls import url
# manager_routing = [
# consumers.ManagerConsumer.as_route(path=r'^/(?P<pk>[0-9]+)/wds/(?P<cols>[0-9]+)/(?P<rows>[0-9]+)/$'),
# ]

manager_routing = [
url(r'^/(?P<pk>[0-9]+)/wds/(?P<cols>[0-9]+)/(?P<rows>[0-9]+)/$', consumers.ManagerConsumer)
]
Loading

0 comments on commit 5a2f075

Please sign in to comment.