一、背景
运维工作涉及到的系统众多,例如蓝鲸、zabbix、Grafana、知识库等等,每一个系统都拥有各自的用户管理与认证功能,随着系统不断增加,用户信息的管理成本不断提高,同时也会导致多个系统之间用户信息冗余、不同步的问题。此外,对于运维人员来说,需要记住每个系统的账户信息也是一件十分令人头疼的事情。一直就想搭建一套OpenLDAP,等到蓝鲸6.0出来后开始支持用户目录了,我们便开始搭建企业内部的OpenLDAP,但如何来管理OpenLDAP的数据呢?phpldapadmin?实在是奇丑无比,用户体验太差了。既然我们在用蓝鲸,何不在蓝鲸上开发一个基于openLDAP的统一用户SaaS。
二、设计思路

1.数据来源
首先要解决的是数据来源问题。公司内部有HR系统对员工信息进行管理,每天会将组织架构和人员信息卸数成文本文件到文件交换服务器。我们便以此为源数据,对其进行解析入库,具体如下:
通过调用蓝鲸作业平台快速分发文件api,将HR系统的卸数文件传输到我们的SaaS服务器上,确认传输成功后,将文件进行解析并入库。通过celery设定定时任务,每日同步一次数据,进而保证了数据的每日同步。
2.数据展示
接下来先是对获取的数据进行展示,这里主要设计了三个页面。
(1)首页:通过地图、饼图、柱状图等形式将机构数量、机构分布地区、员工数量等信息进行数据可视化展示。

(2)机构信息页:左侧展示树状组织架构,右侧展示对应机构员工列表。

(3)人员信息页:展示单个员工的详细信息。

3.主要功能
(1)管理员批量开通ldap账户
为员工开通ldap账户,并设置默认密码为员工身份证的后六位。具体实现:首先我们搭建了ldap服务,这里我们需要存储用户id、所在组织架构、密码、姓名、邮箱几个字段信息。然后SaaS后端将新建ldap账户操作进行封装,前端页面设计为可勾选多名员工,批量开通ldap账户。也可以设置自动开通某个部门下所有员工的LDAP账户,后续该部门有新员工加入后便自动开通,开通后自动发送邮件告知用户。
(2)员工自助开通ldap账户
开通账户并非必须通过管理员操作,于是设计了一个自助页面,员工可以自行通过匹配的工号与手机号,获取短信验证码后进行开通账户以及密码重置操作。

(3)员工ldap账户的删除
我们的SaaS主要是对ldap账户的密码属性进行管理,在每日同步数据时,会将离职状态的员工ldap账号进行删除,也可以通过手动将员工密码置空的操作删除其ldap账户。
4.对接系统
对接蓝鲸平台,在蓝鲸用户管理中进行用户目录相关配置后,可将OpenLDAP的用户同步至蓝鲸。
在对接蓝鲸系统过程中,我们碰到几个问题,一是ITSM流程中我们的组织架构需要细到最小组织层级--团队级别,但是HR系统组织架构仅到部门中心级别,且在ITSM中还需要用到直接上级,于是我们在统一用户SaaS中为每层组织架构新增了负责人字段,该组织下的员工的直接上级就是这个组织的负责人(蓝鲸用户管理中的直接上级是需要一个一个用户去设置的),并且添加了新增、编辑组织架构的功能,这样就能在中心下面继续新建团队。同时每日同步数据逻辑也进行了相应调整,要确保同步时不能将我们在saas上新增的组织架构及调整至下面的员工信息恢复至HR系统的架构,也要确保员工在换部门后能够信息能够同步至SaaS。

第二个问题是蓝鲸6.0的用户目录同步不支持自定义字段,我们需要的企业微信ID、直接上级无法通过用户目录从OpenLDAP直接同步至蓝鲸,解决方法便是通过统一用户管理SaaS直接修改蓝鲸用户管理数据库中的数据,统一用户管理SaaS和蓝鲸用户管理的数据后台都在一个Mysql上,不同的database而已,实现起来还是很方便的。
最后上线后,还需要将原来蓝鲸本地目录的用户切换至OpenLDAP用户,需要先将新OpenLDAP用户的权限设置成和原来用户一样。新增加的OpenLDAP用户默认是没有什么权限的,我们需要将蓝鲸本地用户的权限同步到对应的OpenLDAP用户里。首先我们同步权限中心的用户组,在bkiam库的subject_relation表中先找出所有本地用户及所加入的用户组,再通过姓名找到对应的工号(也为ldap的用户名),如果对应ldap的用户存在,则也将这个ldap的用户加入到老用户所有的用户组中。其次更新cmdb中维护人等字段,通过cmdb的api更新业务信息,将新ldap的用户也加入到CMDB中业务的运维人员等字段中。
蓝鲸对接成功后,又陆续对接了我们的知识库、zabbix、grafana、……未来还可以对接更多的运维管理系统。
5.扩展功能
原先我们的企业微信账号管理也是手工管理,较为麻烦,初始化导入一批后新增的用户需要手工维护部门、手机号、邮箱等信息,且账户id设置为姓名拼音,会出现重名的情况,员工离职也需要手工去删除,这项“手工活”繁琐、容易出错且不易于同步管理。
既然做了统一用户管理SaaS,那当然应该也把企业微信用户管理起来,因此我们将新建企业微信用户操作也放到我们的SaaS里,通过调用企业微信提供的api新建用户与部门,并将现存企业微信用户id同步到SaaS端。将企业微信端的申请加入设置为不允许加入,所有的新账户创建需通过统一用户管理SaaS来开通,今后新开通的企业微信ID都使用员工号,员工离职后也自动删除企业微信,这样一来,SaaS上就有了最全最准确的员工信息、LDAP信息、企业微信id信息,虽然之前开通的企业微信ID为姓名全拼,SaaS上线后开通的企业微信id为员工号,但SaaS上有所有的ID信息,为了方便其它系统给员工发送企业微信的告警通知信息,我们还开发了一个按员工号发送企业微信通知的api(蓝鲸不存在这个问题,因为saas会把企业微信id同步至蓝鲸用户管理)。页面设计上,我们直接在原来的机构页面,添加了一个开通企业微信的按钮,与开通ldap账户逻辑相同,同样是可以勾选员工进行批量开通。
三、总结
至此,本SaaS第一个版本基本完成。本文简要介绍了该项目的设计与开发过程。项目具体的设计开发过程是由多人协作共同完成的,本人原本是一个编程萌新,在小伙伴们的带领下一点点开始这个项目。目前这个版本的页面设计也比较简陋,后续还会进行不断改进。回顾整个过程,自己学习了很多新的知识,基础的编程知识、蓝鲸平台的使用、系统的设计思路、ldap相关知识、各类工具的运用等等,也发现一个系统并不是一天两天就能设计完备的,需要在做的过程中,不断学习不断探索不断改进。




