Argo CD 项目角色查询实战:`argocd proj role get` 命令全解析
2026/9/14 1:48:20 网站建设 项目流程

Argo CD 项目角色查询实战:argocd proj role get命令全解析

【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd

argocd proj role get是 Argo CD CLI 中用于查询指定 AppProject 内角色(Role)详细信息的命令,它一次性展示角色的描述、Casbin 策略、绑定的 OIDC 用户组以及该角色名下的全部 JWT Token。本文以官方命令参考文档为主体,结合仓库源码,完整讲解其语法、输出字段语义、底层数据模型与常见使用场景,帮助你高效排查项目角色与 Token 配置。

一、命令定位:项目角色与argocd proj role命令族

在 Argo CD 中,AppProject(项目)是资源与应用分组的核心边界,而项目内的角色(ProjectRole)则是实现项目级 RBAC 的关键载体:一个角色可以绑定若干条策略(Policies)、若干 JWT Token 和若干 OIDC 组声明(Groups),从而将权限授予不同的用户或自动化流水线。

argocd proj role get属于argocd proj role命令族。从 cmd/argocd/commands/project_role.go 的源码可以看到,argocd proj role共注册了 11 个子命令:

子命令作用
list列出项目中的所有角色
get获取指定角色的详细信息(本文主题)
create创建项目角色
delete删除项目角色
create-token为角色创建 JWT Token
list-tokens列出角色名下的 Token
delete-token删除角色的 Token
add-policy为角色添加策略
remove-policy移除角色策略
add-group为角色绑定 OIDC 组声明
remove-group移除角色的组声明

get命令在整个命令族中承担"查询与验证"职能:无论是新增策略、创建 Token 还是删除 Token,官方示例都习惯在执行变更后再次调用get来确认结果,是角色生命周期管理中最常用的"只读巡检"工具。

二、命令语法与参数说明

argocd proj role get PROJECT ROLE-NAME [flags]

命令要求且仅要求两个位置参数:

参数说明
PROJECTAppProject 的名称,即待查询角色所属的项目
ROLE-NAME项目内角色的名称

从源码 project_role.go 可以看到,命令启动后会首先校验len(args) != 2,参数数量不对会直接打印帮助信息并退出(退出码为 1),随后通过 project gRPC 客户端的Get方法拉取整个项目对象,再调用proj.GetRoleByName(roleName)按名称定位角色——如果角色不存在,会返回错误并终止执行。

-h, --help(显示 help 信息)外,该命令没有独立的专用选项,但继承了大量全局选项(详见本文第五节)。

三、示例输出逐字段解读

官方参考文档给出了如下完整示例:

$ argocd proj role get test-project test-role Role Name: test-role Description: Policies: p, proj:test-project:test-role, projects, get, test-project, allow JWT Tokens: ID ISSUED-AT EXPIRES-AT 1696774900 2023-10-08T15:21:40+01:00 (4 minutes ago) <none> 1696759698 2023-10-08T11:08:18+01:00 (4 hours ago) <none>

输出共分五段,含义如下:

1. Role Name 与 Description

Role Name即角色名;Description是创建角色时通过argocd proj role create --description填写的描述信息,示例中为空。这两个字段直接来源于角色对象的NameDescription属性。

2. Policies(Casbin 策略)

示例中的策略为:

p, proj:test-project:test-role, projects, get, test-project, allow

这是标准的 Casbin 策略格式,由源码中的策略模板 project_role.go 定义:

p, proj:%s:%s, %s, %s, %s/%s, %s

对应关系为:p, proj:<项目名>:<角色名>, <资源>, <动作>, <项目名>/<对象>, <权限>。以示例为例:

字段取值含义
主体proj:test-project:test-role项目作用域内该角色的唯一标识
资源projects资源类型(如projectsapplicationsapplicationsetslogsexec等)
动作get动作(getcreateupdatedeletesyncoverride等)
对象test-project项目内对象,即<项目名>/<对象>组合(/前为项目名,/后为具体对象,*表示通配)
权限allow允许或拒绝(allow/deny

策略列表取自项目的Spec.Roles中该角色的Policies字段。注意,输出的是项目整体的策略字符串集合(proj.ProjectPoliciesString()),因此角色策略是写入项目spec中的持久化配置。

3. Groups(OIDC 组声明)

当角色绑定了 OIDC 组声明时,输出形如:

Groups: - group-a - group-b

当没有绑定任何组时,显示<none>。源码 project_role.go 通过v1alpha1.RoleGroupExists(role)判断角色Groups列表是否非空,再逐行打印。

4. JWT Tokens(Token 列表)

表格包含三列:

  • ID:Token 的签发时间 Unix 时间戳(秒)。注意:历史 Token 以签发时间iat作为标识,新建 Token 则使用 UUID(jti)作为 ID;
  • ISSUED-AT:签发时间,格式为 RFC3339 时间戳加人类可读相对时间,例如2023-10-08T15:21:40+01:00 (4 minutes ago)
  • EXPIRES-AT:过期时间,未设置过期时间时显示<none>(即永久有效)。

这里的 Token 列表来源于项目status中的JWTTokensByRole(按角色归类的已签发 Token),而不是 spec,因此它反映的是实际已签发并被系统记录的 Token 状态。

四、输出背后的数据模型

ProjectRole 结构体

角色对象在 API 层面对应ProjectRole结构体,定义于 pkg/apis/application/v1alpha1/types.go:

type ProjectRole struct { Name string `json:"name" protobuf:"bytes,1,opt,name=name"` Description string `json:"description,omitempty" protobuf:"bytes,2,opt,name=description"` Policies []string `json:"policies,omitempty" protobuf:"bytes,3,rep,name=policies"` JWTTokens []JWTToken `json:"jwtTokens,omitempty" protobuf:"bytes,4,rep,name=jwtTokens"` Groups []string `json:"groups,omitempty" protobuf:"bytes,5,rep,name=groups"` }

其字段与get命令的输出完全一一对应:Name/Description直接打印,Policies以 Casbin 字符串列表保存,JWTTokensGroups分别承载 Token 与组声明。

按角色归类的 Token:JWTTokensByRole

Token 在项目 status 中以JWTTokensByRole map[string]JWTTokens组织(见 app_project_types.go),get命令正是从proj.Status.JWTTokensByRole[roleName].Items中遍历并渲染 Token 表格。

GetRoleByName 与 RoleGroupExists

角色查找与组判断分别由 app_project_types.go 中的GetRoleByName(遍历proj.Spec.Roles按名称匹配,找不到时返回错误role '<name>' does not exist in project '<project>')和同文件第 326 行的RoleGroupExists提供。

时间戳人性化

ISSUED-AT/EXPIRES-AT列的2023-10-08T15:21:40+01:00 (4 minutes ago)格式由 cmd/argocd/commands/project.go 中的humanizeTimestamp生成:先格式化为 RFC3339 标准时间,再拼接相对当前时间的人类可读描述;而tokenTimeToString(见 project_role.go)则规定:时间戳大于 0 时格式化为 RFC3339,否则显示Never

五、完整的全局继承参数说明

argocd proj role get继承自argocd根命令的全部全局选项,适用于所有服务器连接方式(直连 API Server、--core直连 Kubernetes、--port-forward端口转发等):

参数说明
--argocd-context string要使用的 Argo CD 服务器上下文名称
--auth-token string认证 Token;设置此项或ARGOCD_AUTH_TOKEN环境变量
--client-crt string客户端证书文件
--client-crt-key string客户端证书密钥文件
--config stringArgo CD 配置文件路径(默认/home/user/.config/argocd/config
--controller-name stringArgo CD Application controller 名称;当 controller 的 name label 与默认值不同时(例如通过 Helm chart 安装)设置此项或ARGOCD_APPLICATION_CONTROLLER_NAME环境变量(默认argocd-application-controller
--core若设为 true,CLI 直接与 Kubernetes 通信而非与 Argo CD API Server 通信
--grpc-web启用 gRPC-web 协议,适用于 Argo CD Server 位于不支持 HTTP2 的代理之后的情况
--grpc-web-root-path string启用 gRPC-web 协议并设置 web 根路径
-H, --header strings为 Argo CD CLI 的所有请求附加额外请求头(可重复指定多个,也支持逗号分隔)
--http-retry-max int建立到 Argo CD Server 的 HTTP 连接时的最大重试次数
--insecure跳过服务器证书与域名校验
--kube-context string指定要使用的 kube-context
--logformat string日志格式,可选jsontext(默认json
--loglevel string日志级别,可选debuginfowarnerror(默认info
--plaintext禁用 TLS
--port-forward通过端口转发连接一个随机的 argocd-server 端口
--port-forward-namespace string用于端口转发的命名空间
--prompts-enabled强制启用或禁用交互式提示,覆盖本地配置;未指定时使用本地配置值(默认为 false)
--redis-compress string当 application controller 启用了 redis 压缩时启用此选项(可选值gzipnone,默认gzip
--redis-haproxy-name stringRedis HA Proxy 名称;当 HA Proxy 的 name label 与默认值不同时(例如通过 Helm chart 安装)设置此项或ARGOCD_REDIS_HAPROXY_NAME环境变量(默认argocd-redis-ha-haproxy
--redis-name stringRedis deployment 名称;当 Redis 的 name label 与默认值不同时设置此项或ARGOCD_REDIS_NAME环境变量(默认argocd-redis
--repo-server-name stringArgo CD Repo server 名称;名称 label 与默认值不同时设置此项或ARGOCD_REPO_SERVER_NAME环境变量(默认argocd-repo-server
--server stringArgo CD server 地址
--server-crt string服务器证书文件
--server-name stringArgo CD API server 名称;名称 label 与默认值不同时设置此项或ARGOCD_SERVER_NAME环境变量(默认argocd-server

提示:在--core模式下,CLI 直接通过 kubeconfig 访问集群中的 Kubernetes API,无需--server;该模式对只读的get命令同样适用。

六、用get验证角色变更:典型实战流程

get命令最常见的价值在于"变更前后对照"。在 project_role.go 中,add-policy等命令的官方示例均以get作为验证手段。以下是一个完整流程:

1. 查询变更前状态

$ argocd proj role get test-project test-role Role Name: test-role Description: Policies: p, proj:test-project:test-role, projects, get, test-project, allow JWT Tokens: ID ISSUED-AT EXPIRES-AT 1696759698 2023-10-08T11:08:18+01:00 (3 hours ago) <none>

2. 为角色添加"允许更新项目内应用"的策略

$ argocd proj role add-policy test-project test-role -a update -p allow -o project

3. 再次查询确认策略已生效

$ argocd proj role get test-project test-role Role Name: test-role Description: Policies: p, proj:test-project:test-role, projects, get, test-project, allow p, proj:test-project:test-role, applications, update, test-project/project, allow JWT Tokens: ID ISSUED-AT EXPIRES-AT 1696759698 2023-10-08T11:08:18+01:00 (3 hours ago) <none>

4. 为角色创建 Token 并验证

$ argocd proj role create-token test-project test-role Create token succeeded for proj:test-project:test-role. ID: f316c466-40bd-4cfd-8a8c-1392e92255d4 Issued At: 2023-10-08T15:21:40+01:00 Expires At: Never Token: xxx $ argocd proj role get test-project test-role Role Name: test-role Description: Policies: p, proj:test-project:test-role, projects, get, test-project, allow JWT Tokens: ID ISSUED-AT EXPIRES-AT 1696774900 2023-10-08T15:21:40+01:00 (4 minutes ago) <none> 1696759698 2023-10-08T11:08:18+01:00 (4 hours ago) <none>

可以看到新 Token 的 ID(1696774900)即为签发时刻的 Unix 时间戳。若需在脚本中删除 Token,可先使用argocd proj role list-tokens --unixtime输出原始时间戳,再通过argocd proj role delete-token PROJECT ROLE-NAME ISSUED-AT删除——而在删除前后,同样可以用get确认 Token 列表的变化。

其余兄弟命令的参考文档,可参见 argocd proj role 及其下属的 create-token、delete-token、add-policy、remove-policy、list 等文档。

七、使用注意事项与最佳实践

  1. 角色必须存在get依赖GetRoleByName进行精确名称匹配,角色不存在时命令会直接报错退出;可通过argocd proj role list PROJECT先确认角色名称。
  2. 区分 Token ID 的两种形态:历史 Token 以iat时间戳为 ID,新 Token 以 UUID(jti)为 ID;delete-token命令目前仍以iat为参数(见 project_role.go),使用时需留意输出表格第一列的类型。
  3. 策略是声明式配置Policies随项目 spec 持久化,使用argocd proj role add-policy/remove-policy修改后会通过Update接口写回;get看到的策略即项目 spec 中的最终状态。
  4. Token 状态以 status 为准:JWT Token 表格来自proj.Status.JWTTokensByRole,反映控制器实际记录的签发情况;如需原始 Token 串,请在create-token时保存(--token-only可仅输出 Token 以便脚本捕获)。
  5. 合理利用--core模式:在无法访问 API Server 的环境中,可通过--core让命令直连 Kubernetes API,适合集群内的快速巡检场景。

通过本文的语法、示例、参数表与源码级解读,你可以准确读取 Argo CD 项目角色的完整配置快照,并将其作为角色权限变更审计与排障的第一手工具。

【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询