简介
Jenkins角色管理是基于Role Strategy插件来添加新的基于角色的机制来管理用户的权限。
本篇文章是利用role api批量对Jenkins job授权,来写一个脚本。
Role 插件安装就不细写了。
Role配置
Manage Roles
在Manage Roles界面上有三个模块:Global roles、Item roles与Node roles。
Global roles
创建全局角色,例如管理员,作业创建者,匿名角色等,从而可以在全局基础上设置总体,代理,作业,运行,查看和SCM权限。
Item roles
创建项目角色,仅允许基于项目设置Job和Run权限。
在这里我们有两个环境test-*与pre-*,我们分别用不同的环境的项目权限。
比如test-nginx2,pre-nginx2
在添加Item roles的时候有如下规则:
- 如果将字段设置为test-.*,则该角色将匹配名称以开头的所有作业test-。
- 模式区分大小写。要执行不区分大小写的匹配,请使用(?i)表示法:(?i)test-.*这样不区分大小写的。
- 可以使用以下表达式匹配文件夹 ^foo/bar.*
在这里我们添加好管理以test开头的项目与以pre-开头的项目。
Assign Roles
设置好项目角色,将这些角色分配给用户和用户组。
- Global roles:全局角色,设置管理员权限
- Item roles:项目角色,设置项目权限
- Node roles:节点角色,主从节点设置权限
这块我们用Python脚本控制
Python脚本编写
vim /data/script/role.py
#coding:utf8
import requests
import sys
class auth(object):
def __init__(self):
self.Jenkins = {"url":"http://192.168.253.204:8080/role-strategy/strategy/assignRole",
"passwd":"123456"}
#授权
def Grant(self,JK_USER,roleType,roleName):
if roleType == "global" :
data = {'type': 'globalRoles','roleName': roleName,'sid': JK_USER}
elif roleType == "project" :
data = {'type': 'projectRoles','roleName': roleName,'sid': JK_USER}
response = requests.post(self.Jenkins["url"],
data=data,
auth=('root', self.Jenkins["passwd"]))
print(response.status_code,response.text)
return int(response.status_code)
if __name__ == '__main__':
if sys.argv[1] == "help":
print("1. python3 role.py JK_USER global JK_PROJECTNAME")
print("2. python3 role.py JK_USER project JK_PROJECTNAME")
else:
server = auth()
JK_USER = sys.argv[1]
roleType = sys.argv[2]
roleName = sys.argv[3:]
#do grant
for ProjectRoleName in roleName:
result = server.Grant(JK_USER,roleType,ProjectRoleName)
if result <=400 :
print("--->{0}-->{1}-->{2} --->Success!".format(JK_USER,roleType,ProjectRoleName))
else:
raise Exception("--->{0}-->{1}-->{2} --->Error!".format(JK_USER,roleType,ProjectRoleName))
Jenkins Pipeline
node {
stage('授权global角色') {
sh 'python3 /data/script/role.py ${JK_USER} global ${JK_PROJECTNAME}'
}
stage('授权item角色') {
sh 'python3 /data/script/role.py ${JK_USER} project ${JK_PROJECTNAME}'
}
}
新建一个Jenkins Jobs 脚本拷贝进去即可。