前言
由于公司项目越来越多,员工需求比较大,svn这块的管理工作,集中在一个人身上的话,比较繁重,因此就考虑安全的下放svn管理权限,让各部门的老大能够自己去规划组内成员的svn权限分配;
思路
打算让各部门的老大,自己编辑他们本地的一个xlsx表格,这个表格会通过ftp软件在本地打开,实际文件是存放在服务器上的,然后我会通过脚本把xlsx的内容填充到svn权限认证的文件中去(authz),最终同步到svn版本库的指定目录,具体的职责划分如下:
部门leader:编辑部门的人员权限分配xlsx
IT:为每一位成员配合用户名和密码
脚本:根据xlsx表格填充配置文件和用户认证文件,并同步至正式svn服务器
部署流程
由于笔者这里已经部署完成了这套东西,因此这里仅展示各部分内容,有需要的同学,也可以参照这部分部署起来;
Tree
我们先看下目录树结构
root@251:~/zj_tmp/template# cd -
/root/zj_tmp
root@251:~/zj_tmp# tree backup code config template
backup
├── authz_era.template.20210806153445
├── authz_era.template.20210918120616
├── authz_era.template.20210918120728
├── authz_era.template.20210928142538
├── authz_tt2.template.20210810172856
├── authz_tt2.template.20210810172936
├── authz_tt2.template.20210810172948
├── authz_tt2.template.20210818170436
└── authz_tt2.template.20210818170451
code
├── setting.py
├── setting.pyc
└── svn_modifi.py
config
├── authz_dl
├── authz_dlres
├── authz_era
├── authz_tt2
└── passwd
template
├── add_dl_svn.sh
├── add_era_svn.sh
├── add_tt2_svn.sh
├── authz_dlres.template
├── authz_dl.template
├── authz_era.template
├── authz_tt2.template
├── dl.template
├── era.template
├── passwd.template
└── tt2.template
路径说明
简单介绍下各个路径的功能
code:逻辑代码的位置,负责svn的配置填充以及同步至svn服务器
config:填充之后的正式配置文件
template:配置文件的模板以及分支模板,还有三个shell是创建分支的脚本
backup:创建分支之前,需要备份当前的模板,这里是存放备份的地方
除此之外,这台机器上还有各部门的用户以及家目录,家目录里放着每个项目的xlsx表格,表格里的内容展示如下:
ok,下面一起来看看脚本部分的内容。
代码展示
这部分主要针对是code路径下的代码介绍;
首先是setting.py文件,内容如下,这里主要是 涉及一些路径变量的定义和对应xlsx表格所对应的模板文件;
#!/usr/bin/env python
#-*- coding:utf8 -*-
# Powered by ZJ 2021-07-29 16:09:42
template_dir = '/root/zj_tmp/template/'
work_dir = '/data/'
config_dir = '/root/zj_tmp/config/'
xlsx_template = {
'SRSVN权限分布': 'authz_tt2.template',
'DLSVN权限分布': 'authz_dl.template',
'ERASVN权限分布': 'authz_era.template',
'DLRESSVN权限分布': 'authz_dlres.template',
'用户密码配置文件': 'passwd.template'
}
其次是svn_modifi.py文件, 主要是逻辑操作类,内容如下:
#!/usr/bin/env python
#-*- coding:utf8 -*-
# Powered by ZJ 2021-07-09 11:02:19
import os
import sys
import re
import pandas as pd
import numpy as np
from setting import *
def read_excel(filename):
pd.set_option('display.max_columns',None)
pd.set_option('display.width',5000)
xls_text=np.array(pd.read_excel(filename))
return dict(xls_text)
#填充项目权限配置函数
def modifi_pro(xlsx):
'''
处理思路:
从xlsx表中获取到分组名以及分组的成员值,组成字典;
在SVN的配置文件中,把相同组名后面的参数换成从第一步中获取到的成员值;
最后再将生成好的配置文件同步到线上SVN服务器.
'''
if xlsx not in xlsx_template.keys():
print('请确认xlsx文件与模板的对应关系')
sys.exit(1)
group_dict = {}
xlsx_data_dict = {}
temp_file = xlsx_template[xlsx]
final_file = temp_file.split('.')[0]
os.system('cp -rf {} {}'.format(template_dir+temp_file,config_dir+final_file))
varite_files = os.popen("find {} -name '{}*'".format(work_dir,xlsx)).read().strip()
if len(varite_files) <= 0:
print('未找到 {} 相关的xlsx配置文件,请检查!'.format(xlsx))
sys.exit(1)
for xlsx_file in varite_files.split('
'):
xlsx_data = read_excel(xlsx_file)
xlsx_data_dict.update(xlsx_data)
for i in xlsx_data.keys():
varite_str = os.popen("sed -n '/^{} /p' {}".format(i,template_dir+temp_file)).read().strip()
if len(varite_str) <= 0:
continue
varite_value = varite_str.split('=')[1]
varite_line_num = os.popen("sed -n '/^{} /=' {}".format(i,template_dir+temp_file)).read().strip()
group_dict[i] = [varite_value,varite_line_num]
for i in xlsx_data_dict.keys():
os.system("sed -i '{} s/{}/ {}/' {}".format(group_dict[i][1],group_dict[i][0],xlsx_data_dict[i],config_dir+final_file))
return ''
#填充密码文件配置函数
def modifi_pwd(xlsx):
temp_file = xlsx_template[xlsx]
final_file = temp_file.split('.')[0]
os.system('cp -rf {} {}'.format(template_dir+temp_file,config_dir+final_file))
varite_file = os.popen("find {} -name '{}*'".format(work_dir,xlsx)).read().strip()
if len(varite_file) <= 0:
print('未找到 {} 相关的xlsx配置文件,请检查!'.format(xlsx))
sys.exit(1)
xlsx_data = read_excel(varite_file)
for k,v in xlsx_data.items():
tgt_str = str(k)+' = '+str(v)
os.system("sed -i '$a {}' {}".format(tgt_str,config_dir+final_file))
return ''
if __name__ == '__main__':
for i in xlsx_template.keys():
if i == '用户密码配置文件':
modifi_pwd(i)
else:
modifi_pro(i)
os.system("rsync -avz -r --password-file=/etc/rsync.pass /root/zj_tmp/config/ 192.168.0.111::conf")
执行脚本后,你会发现config目录下的文件都更新了,涉及隐私,这里就不展示了,就是常规svn的authz文件分配方案,只是分组的成员标识,被替换成了xlsx表格中对应分组的成员信息;
我们看下template的内容:
[groups]
devclient = ERA_CLIENT
devserver = ERA_SERVER
devdesign = ERA_DESIGN
devart = ERA_ART
devtest = ERA_TEST
在配置文件的group中,我们配置了分组,但是成员部分,我们使用了设定的标识参数(ERA_CLIENT、ERA_SERVER),上面脚本的功能,就是把这里的标识参数,替换成xlsx表格里对应分组的成员信息;
这么解释,大家是不是就能够明白这套逻辑了~
为了跟全面的解放运维同学的双手,我做了计划任务
每十分钟执行一次脚本,也就是说,部门老大在新增了组员之后,十分钟之后自动生效;
root@251:/data/art# crontab -l
*/10 * * * * python /root/zj_tmp/code/svn_modifi.py > /dev/null 2>&1
另外,服务器上的xlsx,可以通过ftp的形式,让各部门的老大进行编辑,我这边是用的工具是WinSCP,这里并不做强制要求;
服务器上的xlsx展示如下:
添加分支
其实添加分支这里,并不打算跟大家详细介绍,因为每个公司添加分支的放是否不一样,笔者这里的方法,并不一定适用于大家的场景,不做赘述了~
总结
以上这套东西部署下来,就能够实现把svn的管理权限下放到部门老大的手中去了 ,防止因为项目过多,由单个人管理的话,需要消耗的精力过大;
这里有一点需要注意,这套东西仅仅是针对简单的人员新增或者削减,以及具体人员在svn配置的分组中的情况进行调整,也就是比较简单的场景,如果复杂的,涉及到模板变动的,还是需要由专门的管理员去维护的;
没法做到完全的托管,但是可以适当减少企业微信头像的跳动频率,我 i 了。