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]命令要求且仅要求两个位置参数:
| 参数 | 说明 |
|---|---|
PROJECT | AppProject 的名称,即待查询角色所属的项目 |
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填写的描述信息,示例中为空。这两个字段直接来源于角色对象的Name与Description属性。
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 | 资源类型(如projects、applications、applicationsets、logs、exec等) |
| 动作 | get | 动作(get、create、update、delete、sync、override等) |
| 对象 | 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 字符串列表保存,JWTTokens与Groups分别承载 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 string | Argo CD 配置文件路径(默认/home/user/.config/argocd/config) |
--controller-name string | Argo 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 | 日志格式,可选json或text(默认json) |
--loglevel string | 日志级别,可选debug、info、warn、error(默认info) |
--plaintext | 禁用 TLS |
--port-forward | 通过端口转发连接一个随机的 argocd-server 端口 |
--port-forward-namespace string | 用于端口转发的命名空间 |
--prompts-enabled | 强制启用或禁用交互式提示,覆盖本地配置;未指定时使用本地配置值(默认为 false) |
--redis-compress string | 当 application controller 启用了 redis 压缩时启用此选项(可选值gzip、none,默认gzip) |
--redis-haproxy-name string | Redis HA Proxy 名称;当 HA Proxy 的 name label 与默认值不同时(例如通过 Helm chart 安装)设置此项或ARGOCD_REDIS_HAPROXY_NAME环境变量(默认argocd-redis-ha-haproxy) |
--redis-name string | Redis deployment 名称;当 Redis 的 name label 与默认值不同时设置此项或ARGOCD_REDIS_NAME环境变量(默认argocd-redis) |
--repo-server-name string | Argo CD Repo server 名称;名称 label 与默认值不同时设置此项或ARGOCD_REPO_SERVER_NAME环境变量(默认argocd-repo-server) |
--server string | Argo CD server 地址 |
--server-crt string | 服务器证书文件 |
--server-name string | Argo 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 project3. 再次查询确认策略已生效
$ 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 等文档。
七、使用注意事项与最佳实践
- 角色必须存在:
get依赖GetRoleByName进行精确名称匹配,角色不存在时命令会直接报错退出;可通过argocd proj role list PROJECT先确认角色名称。 - 区分 Token ID 的两种形态:历史 Token 以
iat时间戳为 ID,新 Token 以 UUID(jti)为 ID;delete-token命令目前仍以iat为参数(见 project_role.go),使用时需留意输出表格第一列的类型。 - 策略是声明式配置:
Policies随项目 spec 持久化,使用argocd proj role add-policy/remove-policy修改后会通过Update接口写回;get看到的策略即项目 spec 中的最终状态。 - Token 状态以 status 为准:JWT Token 表格来自
proj.Status.JWTTokensByRole,反映控制器实际记录的签发情况;如需原始 Token 串,请在create-token时保存(--token-only可仅输出 Token 以便脚本捕获)。 - 合理利用
--core模式:在无法访问 API Server 的环境中,可通过--core让命令直连 Kubernetes API,适合集群内的快速巡检场景。
通过本文的语法、示例、参数表与源码级解读,你可以准确读取 Argo CD 项目角色的完整配置快照,并将其作为角色权限变更审计与排障的第一手工具。
【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考