svn管理权限下放方案

前言

由于公司项目越来越多,员工需求比较大,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表格,表格里的内容展示如下:

image

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('\n'):
        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展示如下:

image

添加分支

其实添加分支这里,并不打算跟大家详细介绍,因为每个公司添加分支的放是否不一样,笔者这里的方法,并不一定适用于大家的场景,不做赘述了~

总结

以上这套东西部署下来,就能够实现把svn的管理权限下放到部门老大的手中去了 ,防止因为项目过多,由单个人管理的话,需要消耗的精力过大;
这里有一点需要注意,这套东西仅仅是针对简单的人员新增或者削减,以及具体人员在svn配置的分组中的情况进行调整,也就是比较简单的场景,如果复杂的,涉及到模板变动的,还是需要由专门的管理员去维护的;
没法做到完全的托管,但是可以适当减少企业微信头像的跳动频率,我 i 了。

posted @ 2021-10-13 19:57  一个运维  阅读(168)  评论(0编辑  收藏  举报