Skip to content

Commit

Permalink
简化ldap流程,ldap认证时自动同步用户信息
Browse files Browse the repository at this point in the history
readme增加错误解决方案
  • Loading branch information
hhyo authored and lihuanhuan committed May 15, 2018
1 parent 2936218 commit 183f33c
Show file tree
Hide file tree
Showing 8 changed files with 184 additions and 168 deletions.
145 changes: 103 additions & 42 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,43 +1,5 @@
# archer
基于inception的自动化SQL操作平台,支持工单、审核、定时任务、邮件、OSC等功能,额外可配置功能有MySQL查询、动态脱敏、查询权限管理、慢查询管理、阿里云RDS管理等,页面可自适应小屏设备,

## 2.0更新说明
### 更新内容
- 新增
>增加DBA角色,SQL上线逻辑调整为:工程师提SQL->审核人审核->DBA执行,同时也支持DBA一个角色的审核和执行
>增加定时执行SQL工单,将审核和执行分离
>增加SQL在线查询模块,支持查询权限申请、审核、管理,支持查询动态脱敏,保护隐私数据,可配置,默认不展示
>增加SQL慢日志收集管理模块,可配置,默认不展示
>增加SQL优化模块,基于SQLadvisor一键优化慢查询,可配置,默认不展示
>增加阿里云RDS管理模块,管理RDS进程、慢查询、表空间信息,可配置,默认不展示
>增加工单审核驳回备注,流程沟通更顺畅
>增加SQL上传功能,提交工单更快速
>增加全局异常日志捕获,方便定位问题
>增加Dockerfile信息,自动构建最新docker镜像
- 优化
>全局表格样式调整,显著提升显示性能,并且兼容手机等小屏设备
>工单列表调整,支持工单名称和提交人搜索,列表性能优化
>工单详情性能优化,解决提交语句过多可能造成服务崩溃的问题
>图表展示优化,via绝望的生鱼片
>登录时自动认证管理后台,避免二次登录
>页面显示用户中文名
- 修复
>修复SQL语句执行时间过长造成工单状态持续执行中的问题
>调整回滚语句为倒序展示,避免提交回滚异常
### 升级步骤
1. 克隆2.0分支代码到本地或者下载zip包
`git clone -b archer-2.0 https://github.com/jly8866/archer.git`
2. 使用src/init_sql内的变更脚本变更数据库
v1.1.1分支请使用v1.1.1->v2.0.sql
master分支请使用nowmaster->v2.0.sql
2.0分支无需变更数据库
3. 安装相关模块
`pip3 install -r requirements.txt -i https://mirrors.ustc.edu.cn/pypi/web/simple/`
4. 初始化django-apscheduler相关表
`python3 manage.py migrate`
5. 修改相关配置文件,启动
nginx的static目录配置有调整,具体参考后面的配置
基于inception的自动化SQL操作平台,支持工单、审核、定时任务、邮件、OSC等功能,额外可配置功能有MySQL查询、动态脱敏、查询权限管理、慢查询管理、阿里云RDS管理等

### 开发语言和推荐环境
python:3.4及以上
Expand Down Expand Up @@ -82,6 +44,7 @@
* 可通过django admin进行匹配SQL关键字的工单搜索
* 发起SQL上线,可配置的邮件提醒审核人进行审核
* 在发起SQL上线前,自助SQL审核,给出建议
* 支持手机端操作

## 设计规范
* 合理的数据库设计和规范很有必要,尤其是MySQL数据库,内核没有oracle、db2、SQL Server等数据库这么强大,需要合理设计,扬长避短。互联网业界有成熟的MySQL设计规范,特此撰写如下。请读者在公司上线使用archer系统之前由专业DBA给所有后端开发人员培训一下此规范,做到知其然且知其所以然。
Expand All @@ -90,6 +53,43 @@
## 主要配置文件
* archer/archer/settings.py

## 2.0更新说明
#### 更新内容
- 新增
>增加DBA角色,SQL上线逻辑调整为:工程师提SQL->审核人审核->DBA执行,同时也支持DBA一个角色的审核和执行
>增加定时执行SQL工单,将审核和执行分离
>增加SQL在线查询模块,支持查询权限申请、审核、管理,支持查询动态脱敏,保护隐私数据,可配置,默认不展示
>增加SQL慢日志收集管理模块,可配置,默认不展示
>增加SQL优化模块,基于SQLadvisor一键优化慢查询,可配置,默认不展示
>增加阿里云RDS管理模块,管理RDS进程、慢查询、表空间信息,可配置,默认不展示
>增加工单审核驳回备注,流程沟通更顺畅
>增加SQL上传功能,提交工单更快速
>增加全局异常日志捕获,方便定位问题
>增加Dockerfile信息,自动构建最新docker镜像
- 优化
>全局表格样式调整,显著提升显示性能,并且兼容手机等小屏设备
>工单列表调整,支持工单名称和提交人搜索,列表性能优化
>工单详情性能优化,解决提交语句过多可能造成服务崩溃的问题
>图表展示优化,via绝望的生鱼片
>登录时自动认证管理后台,避免二次登录
>页面显示用户中文名
- 修复
>修复SQL语句执行时间过长造成工单状态持续执行中的问题
>调整回滚语句为倒序展示,避免提交回滚异常
#### 升级步骤(仅用于现有版本升级,全新安装请参考后面的部署方法)
1. 克隆2.0分支代码到本地或者下载zip包
`git clone -b archer-2.0 https://github.com/jly8866/archer.git`
2. 使用src/init_sql内的变更脚本变更数据库
v1.1.1分支请使用v1.1.1->v2.0.sql
master分支请使用nowmaster->v2.0.sql
2.0分支无需变更数据库
3. 安装相关模块
`pip3 install -r requirements.txt -i https://mirrors.ustc.edu.cn/pypi/web/simple/`
4. 初始化django-apscheduler相关表
`python3 manage.py migrate`
5. 修改相关配置文件,启动

## 采取docker部署
* docker镜像,参考wiki:
* inception镜像: https://dev.aliyun.com/detail.html?spm=5176.1972343.2.12.7b475aaaLiCfMf&repoId=142093
Expand All @@ -102,7 +102,7 @@

## 手动安装步骤
1. 环境准备:
(1)克隆代码到本地或者下载zip包
(1)克隆代码到本地或者下载2.0分支zip包
`git clone -b archer-2.0 https://github.com/jly8866/archer.git`
(2)安装inception,[项目地址](http://mysql-inception.github.io/inception-document/install/)
2. 安装python3,版本号>=3.4:(由于需要修改官方模块,请使用virtualenv或venv等单独隔离环境!)
Expand Down Expand Up @@ -274,8 +274,69 @@ pip install django-auth-ldap==1.3.0
## 联系方式:
QQ群:524233225
## 部分小问题解决办法:
1. 报错:
## 部分问题解决办法:
#### 页面样式显示异常
1. runserver/debug.sh启动
settings里面关闭了debug,即DEBUG = False,需要在启动命令后面增加 --insecure,变成
`python3 manage.py runserver 0.0.0.0:9123 --insecure`
2. nginx+gunicorn/startup.sh启动
nginx的静态资源配置不正确
```
location /static {
alias /archer/static; #此处指向settings.py配置项STATIC_ROOT目录的绝对路径,用于nginx收集静态资源,一般默认为archer按照目录下的static目录
}
```
#### 用户管理
1. 偶现添加用户报错
采用nginx+gunicorn/startup.sh启动,多worker的部署,目前问题没有解决,可使用非save按钮进行添加
2. 无法登录(确认用户名和密码正确)
检查用户is_active字段是否为1,django自带认证默认is_active约束是否可以登录前台,is_status约束是否可以登录后台管理
#### SQL上线
1. 集群不显示数据库
archer会默认过滤一些系统数据库,过滤列表为`'information_schema', 'performance_schema', 'mysql', 'test', 'sys'`
主库配置的用户名或密码错误
2. 审核人不显示
不能提交给自己审核,即使当前登录人是审核人/DBA
没有审核人/DBA角色的有效用户
3. 检测SQL报错
3.1. invalid literal for int() with base 10:'Inception2'
调整pymysql使其兼容Inception版本信息,
使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/目录下的文件,或者按照安装文档修改
3.2. invalid source infomation
inception用来审核的账号,密码不能包含*
3.3. Must start as begin statement
inception用来审核的账号或者密码不正确
3.4. Incorrect database name ''
inception检查不支持子查询
3.5. Invalid remote backup information
原因暂时不明
#### 无法生成回滚语句
1. 检查配置文件里面inception相关配置
2. 检查inception审核用户和备份用户权限,权限参考
```
— inception备份用户
GRANT SELECT, INSERT, CREATE ON *.* TO 'inception_bak'
— inception审核用户(各个业务实例)
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER,REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'inception'
— archer在线查询用户
GRANT SELECT ON *.* TO 'archer_read'

```
3. 检查binlog格式,需要为ROW
4. 检查DML的表是否存在主键
#### 定时任务
1. 未执行
检查django-apscheduler相关表是否有创建,可使用`python3 manage.py migrate`创建
#### 其他错误:
![image](https://github.com/hhyo/archer/blob/master/src/screenshots/bugs/bug1.png)
![image](https://github.com/hhyo/archer/blob/master/src/screenshots/bugs/bug2.png)
原因:python3的pymysql模块会向inception发送SHOW WARNINGS语句,导致inception返回一个"Must start as begin statement"错误被archer捕捉到报在日志里
Expand Down
53 changes: 32 additions & 21 deletions archer/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,29 +109,34 @@

###############以下部分需要用户根据自己环境自行修改###################

# session 设置
SESSION_COOKIE_AGE = 60 * 30 # 30分钟
SESSION_SAVE_EVERY_REQUEST = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 关闭浏览器,则COOKIE失效

# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

# 该项目本身的mysql数据库地址
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'archer',
'USER': 'archer_rw',
'PASSWORD': 'archer_rw',
'NAME': 'archer_github',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '5000'
'PORT': '3306'
}
}

# inception组件所在的地址
INCEPTION_HOST = '192.168.1.11'
INCEPTION_PORT = '6100'
INCEPTION_HOST = '127.0.0.1'
INCEPTION_PORT = '6669'

# 查看回滚SQL时候会用到,这里要告诉archer去哪个mysql里读取inception备份的回滚信息和SQL.
# 注意这里要和inception组件的inception.conf里的inception_remote_XX部分保持一致.
INCEPTION_REMOTE_BACKUP_HOST = '192.168.1.12'
INCEPTION_REMOTE_BACKUP_PORT = 5621
INCEPTION_REMOTE_BACKUP_PORT = 3306
INCEPTION_REMOTE_BACKUP_USER = 'inception'
INCEPTION_REMOTE_BACKUP_PASSWORD = 'inception'

Expand All @@ -147,24 +152,30 @@
# from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
from django_auth_ldap.config import LDAPSearch, GroupOfUniqueNamesType

AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend', # 配置为先使用LDAP认证,如通过认证则不再使用后面的认证方式
'django.contrib.auth.backends.ModelBackend', # sso系统中手动创建的用户也可使用,优先级靠后。注意这2行的顺序
)

# if use self signed certificate, Remove AUTH_LDAP_GLOBAL_OPTIONS annotations
# AUTH_LDAP_GLOBAL_OPTIONS={
# ldap.OPT_X_TLS_REQUIRE_CERT: ldap.OPT_X_TLS_NEVER
# }
AUTH_LDAP_BIND_DN = "cn=ro,dc=xxx,dc=cn"
AUTH_LDAP_BIND_PASSWORD = "xxxxxx"
AUTH_LDAP_SERVER_URI = "ldap://auth.xxx.com"
AUTH_LDAP_BASEDN = "ou=users,dc=xxx,dc=cn"
AUTH_LDAP_USER_DN_TEMPLATE = "cn=%(user)s,ou=users,dc=xxx,dc=cn"
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=groups,dc=xxx,dc=cn",

AUTH_LDAP_BIND_DN = "cn=xx,dc=xx,dc=xx"
AUTH_LDAP_BIND_PASSWORD = "xx"
AUTH_LDAP_SERVER_URI = "ldap://ldap.xx.com"
AUTH_LDAP_BASEDN = "dc=xx,dc=xx"
AUTH_LDAP_USER_DN_TEMPLATE = "cn=%(user)s,ou=xx,dc=xx,dc=xx"
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=xx,dc=xx,dc=xx",
ldap.SCOPE_SUBTREE, "(objectClass=groupOfUniqueNames)"
)
AUTH_LDAP_GROUP_TYPE = GroupOfUniqueNamesType()
AUTH_LDAP_USER_ATTRLIST = ["cn", "sn", "mail"]
AUTH_LDAP_USER_ATTR_MAP = {
"username": "cn",
"display": "sn",
"email": "mail"
AUTH_LDAP_ALWAYS_UPDATE_USER = True # 每次登录从ldap同步用户信息
AUTH_LDAP_USER_ATTR_MAP = { # key为archer.sql_users字段名,value为ldap中字段名,用于同步用户信息
"username": "xx",
"display": "xx",
"email": "xx"
}

# AUTH_LDAP_MIRROR_GROUPS = True # 直接把ldap的组复制到django一份,和AUTH_LDAP_FIND_GROUP_PERMS互斥.用户每次登录会根据ldap来更新数据库的组关系
Expand Down Expand Up @@ -216,12 +227,12 @@
# 'django.db': { # 打印SQL语句到console,方便开发
# 'handlers': ['console'],
# 'level': 'DEBUG',
# 'propagate': True,
# 'propagate': False,
# },
'django.request': { # 打印SQL语句到console,方便开发
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True,
'propagate': False,
},
'django_auth_ldap': { # django_auth_ldap模块相关日志打印到console
'handlers': ['ldap'],
Expand All @@ -232,7 +243,7 @@
}

# 是否开启邮件提醒功能:发起SQL上线后会发送邮件提醒审核人审核,执行完毕会发送给DBA. on是开,off是关,配置为其他值均会被archer认为不开启邮件功能
MAIL_ON_OFF = 'on'
MAIL_ON_OFF = 'off'

MAIL_REVIEW_SMTP_SERVER = 'mail.xxx.com'
MAIL_REVIEW_SMTP_PORT = 25
Expand Down
2 changes: 1 addition & 1 deletion sql/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def __init__(self, *args, **kwargs):
class usersAdmin(UserAdmin):
def __init__(self, *args, **kwargs):
super(usersAdmin, self).__init__(*args, **kwargs)
self.list_display = ('id', 'username', 'display', 'role', 'email', 'password', 'is_superuser', 'is_staff')
self.list_display = ('id', 'username', 'display', 'role', 'email', 'is_superuser', 'is_staff', 'is_active')
self.search_fields = ('id', 'username', 'display', 'role', 'email')
self.form = usersChangeForm
self.add_form = usersCreationForm
Expand Down
4 changes: 0 additions & 4 deletions sql/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ class Meta:
verbose_name = u'用户配置'
verbose_name_plural = u'用户配置'


users._meta.get_field('is_active').default = False # ldap default can't login, need admin to control


# 各个线上主库地址。
class master_config(models.Model):
cluster_name = models.CharField('集群名称', max_length=50, unique=True)
Expand Down
2 changes: 0 additions & 2 deletions sql/processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@
leftMenuBtnsSuper = (
{'key': 'diagnosis', 'name': 'RDS进程管理', 'url': '/diagnosis_process/', 'class': 'glyphicon glyphicon-scissors',
'display': settings.ALIYUN_RDS_MANAGE},
{'key': 'ldapsync', 'name': '同步LDAP用户', 'url': '/ldapsync/', 'class': 'glyphicon glyphicon-th-large',
'display': settings.ENABLE_LDAP},
{'key': 'admin', 'name': '后台数据管理', 'url': '/admin/', 'class': 'glyphicon glyphicon-list', 'display': True},
)

Expand Down
2 changes: 0 additions & 2 deletions sql/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
url(r'^timingtask/$', views.timingtask, name='timingtask'),
url(r'^cancel/$', views.cancel, name='cancel'),
url(r'^rollback/$', views.rollback, name='rollback'),
url(r'^ldapsync/$', views.ldapsync, name='ldapsync'),
url(r'^sqlquery/$', views.sqlquery, name='sqlquery'),
url(r'^slowquery/$', views.slowquery, name='slowquery'),
url(r'^sqladvisor/$', views.sqladvisor, name='sqladvisor'),
Expand All @@ -36,7 +35,6 @@

url(r'^authenticate/$', views_ajax.authenticateEntry, name='authenticate'),
url(r'^sqlworkflow/$', views_ajax.sqlworkflow, name='sqlworkflow'),
url(r'^syncldapuser/$', views_ajax.syncldapuser, name='syncldapuser'),
url(r'^simplecheck/$', views_ajax.simplecheck, name='simplecheck'),
url(r'^getMonthCharts/$', views_ajax.getMonthCharts, name='getMonthCharts'),
url(r'^getPersonCharts/$', views_ajax.getPersonCharts, name='getPersonCharts'),
Expand Down
7 changes: 0 additions & 7 deletions sql/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -464,13 +464,6 @@ def rollback(request):
'cluster_name': cluster_name, 'review_man': review_man, 'sub_review_man': sub_review_man}
return render(request, 'rollback.html', context)


# ldap用户同步
def ldapsync(request):
context = {'currentMenu': 'ldapsync'}
return render(request, 'ldapsync.html', context)


# SQL审核必读
def dbaprinciples(request):
context = {'currentMenu': 'dbaprinciples'}
Expand Down
Loading

0 comments on commit 183f33c

Please sign in to comment.