Argo CD 如何创建本地用户并生成 API Token 供自动化使用
【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd
如果需要用脚本或 CI 流水线调用 Argo CD API(创建 Application、触发同步、查询状态),需要先让 Argo CD 认识一个可用的身份。本文基于 Argo CD 的本地用户(local users/accounts)功能完成一条完整链路:在argocd-cmConfigMap 中定义本地账号,在argocd-rbac-cm中配置自动化所需的权限,用 Argo CD CLI 为该账号生成 API token,并验证和吊销 token。前提条件:已部署 Argo CD 实例、可访问 Argo CD 命名空间(默认argocd)的kubectl、已安装 Argo CD CLI,并以admin用户完成初始配置。
Argo CD 安装后只有一个内置admin用户,拥有系统完全访问权限;官方文档建议admin仅用于初始配置,之后切换到本地用户或 SSO(见用户管理文档)。本地用户有两个能力(capability):apiKey(允许为 API 访问生成认证 token)和login(允许通过 UI 登录)。只用于自动化时,只授予apiKey即可。
在 argocd-cm 中创建本地账号
本地用户定义在argocd-cmConfigMap 中,而不是通过 API 创建。用kubectl编辑:
kubectl edit configmap argocd-cm -n argocd在data段中添加accounts.<username>键,值为能力列表。以官方文档中的ci-bot账号为例:
data: accounts.ci-bot: apiKey如果该账号还需要登录 Argo CD UI,写成accounts.ci-bot: apiKey, login。三个需要留意的点:
- 本地账号的用户名最大长度为 32;
- 账号默认启用;要停用账号时增加键
accounts.ci-bot.enabled: "false"; - 本地用户如果没有单独配置 RBAC 规则,会回落到
argocd-rbac-cmConfigMap 中policy.default字段指定的默认策略。账号创建后实际拥有什么权限,取决于下一步的 RBAC 配置。
为用户设置密码(可选)
如果账号授予了login能力,用 CLI 设置密码。argocd account update-password需要三个参数:--account指定目标账号,--current-password是当前操作用户自己的密码(以 admin 身份管理其他用户时,这里填当前 admin 密码),--new-password是新密码:
argocd account update-password \ --account ci-bot \ --current-password <current-user-password> \ --new-password <new-user-password>其中<current-user-password>和<new-user-password>替换为你自己的密码值。仅用于自动化(只带apiKey能力)的账号不需要这一步即可生成 token,可跳过。
为本地用户配置 RBAC 权限
按 RBAC 配置文档,本地用户获取权限的方式有两种:把策略(policy)直接指派给用户,或把用户指派到某个角色。编辑argocd-rbac-cmConfigMap 的policy.csv键。
方式一,直接给用户指派策略(本文自动化场景推荐):
apiVersion: v1 kind: ConfigMap metadata: name: argocd-rbac-cm namespace: argocd data: policy.csv: | p, ci-bot, applications, sync, my-project/*, allow p, ci-bot, applications, get, my-project/*, allow上面示例给ci-bot授予my-project项目下所有 application 的sync与get权限,my-project替换为你的实际项目名。策略格式为p, <role/user/group>, <resource>, <action>, <object>, <effect>,各资源支持的 action 组合见 RBAC 文档中的表格。
方式二,把用户指派到角色,例如g, ci-bot, role:readonly。官方文档同时警告:如果同时启用了 SSO,scope 值恰好与本地用户名相同的 SSO 用户会被加入与本地用户相同的角色。因此在本地用户与 SSO 共存的集群中,建议用p, ...直接给本地用户指派策略,而不是用g, ...指派角色。
生成 API token
保存 ConfigMap 后,为该账号生成 token。省略--account时,Argo CD 为当前登录用户生成 token;显式指定账号:
argocd account generate-token --account ci-bot --expires-in 24h参数说明(来自 argocd account generate-token 命令参考):
--account:账号名,默认是当前账号;--expires-in:token 有效期,默认0s,即永不过期。官方文档明确警告:不带--expires-in生成的 token 永远不会过期,应优先使用短期 token 并从自动化系统做轮换;--id:可选的 token ID,未指定时回退为 uuid。指定 ID 便于之后精确吊销该 token。
命令输出即 token 本身,妥善保存。文档的 CI 场景把它作为ARGOCD_AUTH_TOKEN存入 CI secrets。
验证 token 可用
把生成的 token 设置为ARGOCD_AUTH_TOKEN环境变量(Argo CD CLI 的通用参数支持该环境变量),然后验证身份和权限:
export ARGOCD_AUTH_TOKEN=<生成的token> # 确认账号已存在 argocd account list # 查询当前 token 的权限,文档示例:能否同步任意 application argocd account can-i sync applications '*'argocd account can-i的更多示例包括查询单个 project(argocd account can-i update projects 'default')和创建集群(argocd account can-i create clusters '*'),完整参数见 argocd account can-i 参考。也可以用argocd account get --account ci-bot查询账号详情。
最后用一次真实调用做端到端验证。以文档中的 CI 场景为例,用 token 触发同步(文档中ARGOCD_SERVER使用argocd.example.com,这是文档示例值,替换为你的 Argo CD 服务器地址):
export ARGOCD_SERVER=argocd.example.com export ARGOCD_AUTH_TOKEN=<生成的token> # 也可以从 API server 直接下载与服务器版本匹配的 CLI curl -sSL -o /usr/local/bin/argocd https://${ARGOCD_SERVER}/download/argocd-linux-amd64 argocd app sync guestbook argocd app wait guestbook这条“从 API server 下载 CLI + 用 token 触发同步”的完整流程见 Automation from CI Pipelines。argocd app sync执行成功且argocd app wait显示同步完成,即说明 token、RBAC 权限和自动化链路都配置到位。
吊销 token 与删除账号
token 失效或泄露时,按 token ID 吊销单个 token:
# 删除当前账号的指定 token argocd account delete-token ID # 删除指定账号的指定 token argocd account delete-token --account ci-bot IDID是 token ID;如果生成时用过--id,这里就使用该值。命令参考见 argocd account delete-token。
要彻底移除账号,从argocd-cm删除对应键,官方文档同时建议移除argocd-secretSecret 中对应的密码条目:
kubectl patch -n argocd cm argocd-cm --type='json' -p='[{"op": "remove", "path": "/data/accounts.ci-bot"}]' kubectl patch -n argocd secrets argocd-secret --type='json' -p='[{"op": "remove", "path": "/data/accounts.ci-bot.password"}]'只想临时停用账号而不删除时,在argocd-cm中设置accounts.ci-bot.enabled: "false"。
限制与边界
- 本地用户不提供群组、登录历史等高级功能,需要这些能力时官方文档强烈建议改用 SSO。
- 所有已认证用户至少拥有
policy.default授予的默认权限,这部分权限无法被deny规则阻止,配置argocd-rbac-cm时需要注意默认策略的范围。 - 官方文档建议在创建额外用户后尽快禁用
admin(在argocd-cm中设置admin.enabled: "false")。 - 如果自动化场景是“把清单提交到 Git、由 Argo CD 自动 reconcile”,则不需要管理任何 token;只有必须直接调用 CLI/API(触发同步、查询状态等)时才使用本地用户 token。其他无浏览器认证方式(project role token、Dex token exchange 等)见CI/CD Pipeline Authentication小节。
【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考